题解 | 整点巧克力

整点巧克力

https://www.nowcoder.com/practice/e00ad43c2f774191a81c177f1453e554

#include <iostream>
using namespace std;

int main() {
	int n, m;
	cin >> n >> m;
	int* a = new int[n + 1];
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	} 
  	//注意二分的右边界,一开始想错了以为m = n那么r不会超过1e7,但是当m远小于n时r的右边界最大会到m * n
	long long l = 1, r = 1e11;
	int* eat = new int[n + 1];
	while (r > l) {
		long long mid = (r - l) / 2 + l;
		//第几块巧克力 
		int j = -1, days = 0;
		long long cnt = 0;
		while (j < n) {
			cnt >>= 1;
			while (j < n && cnt < mid) {
				j++;
				cnt += a[j];
			}
			if (j < n) days++;
		}
		if (days >= m) l = mid + 1;
		else r = mid;
	}
  	//二分过程中保留eat[]会出现因为mid = left + 1而导致存储错误的结果
	int j = -1, days = 0;
	long long cnt = 0;
	while (j < n) {
		cnt >>= 1;
		while (j < n && cnt < l - 1) {
			j++;
			eat[j] = min(days + 1, m);
			cnt += a[j];
		}
		if (j < n) days++;
	}
	cout << l - 1 << endl;
	for (int i = 0; i < n; i++) {
		cout << eat[i] <<endl;
	}
} 

全部评论

相关推荐

11-06 16:50
门头沟学院 Java
用微笑面对困难:word打字比赛二等奖的我,也要来凑合凑合
点赞 评论 收藏
分享
苗条的伊泽瑞尔最喜欢...:同28届被压力了,电科✌就不能去卷算法吗?把Java留给我们双非卷
投递快手等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务