站外题求条
  • 板块灌水区
  • 楼主wheat__
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/9/8 18:01
  • 上次更新2024/9/8 18:23:34
查看原帖
站外题求条
771125
wheat__楼主2024/9/8 18:01
题目:
贝西收到了 N 块巧克力,她会在接下来的 D 天里吃掉这些巧克力,她想制定一个计划,让她每天的快乐度都保持在较高的水品上。 在第一天刚开始的时候,贝西的快乐度为 0。巧克力必须从第一块吃起,不能打乱食用的次序,因为公牛们是按照这个顺序送给她的。吃掉第 i 块巧克力,会让她的快乐度立即增加 A i 。贝西在一天内可以连续食用多块巧克力,也可以一块也不吃。不管如何,当她晚上睡觉之后,快乐度会在半夜减半,如果快乐度是个奇数,则向下取整。请问贝西应该怎样吃巧克力,才能让她在 D 天内最小快乐度最大呢?

输入:
第一行:两个整数 N 和 D,1 ≤ N,D ≤ 50000
第二行到第 N + 1 行:第 i + 1 行有一个整数 H i ,1 ≤ H i ≤ 10^ 6

输出:
单个整数:表示贝西在 D 天内的最小快乐度的最大值

样例输入:
5 5
10
40
13
22
7

样例输出:
24

提示:
第一天吃前两块巧克力,第二天一块都不吃,接下来三天每天各吃一块。

我的代码:

#include<iostream>
#include<algorithm>
using namespace std;
long long n,d;
long long a[50001];
long long ans;
bool check(long long x){
    long long tot=0,sum=0;
    for(int i=1;i<=d;i++){
        sum/=2;
        while(sum<x){
        	tot++;
            sum+=a[tot];
            if(tot>n) return 0;
        }
    }
    return 1;
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>d;
	long long sum=0;
	long long r=0;
	for(int i=1;i<=d;i++){
		cin>>a[i];
		r+=a[i];
	}
	long long l=1,mid;
	while(l<=r){
		mid=(l+r)/2;
		if(check(mid)){
			ans=mid;
			l=mid+1;
		}else r=mid-1;
	}
	cout<<ans;
	return 0;
}

开了long long,但还是WA了几个点

求各位大佬帮一下

2024/9/8 18:01
加载中...