标签:
题目大意:有一个人财政赤字了,每天都要还一定数量的钱,共要还N天。
现在他要求把这N天还的钱变成M次还掉,也就是说不用每天都还了,可以累积一定的天数再还。
现在要求M次还掉的钱中,钱的最大值达到最小,问这个最小值是多少
解题思路:最大值最小,二分解决
枚举的最小值是每天还的钱中的最大值,最大值是每天还的钱的总和
因为每次枚举的钱肯定是大于等于每天还的钱中的最大值的,所以最多可以分成N个集合,然后在算出最小的集合,最小的集合数量就是每一个集合尽量包含更多的天数
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 100010
long long num[maxn],Sum, Min;
int N, M;
bool judge(long long mid) {
int cnt = 1, count;
long long money = 0;
for(int i = 0; i < N; i++) {
money += num[i];
if(money > mid) {
money = 0;
i--;
cnt++;
}
}
if(cnt <= M)
return true;
return false;
}
long long solve() {
long long l = Min, r = Sum;
while(l < r) {
long long mid = (l + r) / 2;
if(judge(mid))
r = mid - 1;
else
l = mid + 1;
}
return l;
}
int main() {
while(scanf("%d%d",&N, &M) != EOF) {
Sum = 0, Min = -1;
for(int i = 0; i < N; i++) {
scanf("%lld", &num[i]);
Min = max(Min, num[i]);
Sum += num[i];
}
printf("%lld\n",solve());
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/l123012013048/article/details/45648269