题意:给出农夫在n天中每天的花费,要求把这n天分作m组,每组的天数必然是连续的,要求分得各组的花费之和应该尽可能地小,最后输出各组花费之和中的最大值。
题解:二分答案即可
附上代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1e5+50;
int n,m,money[maxn];
bool solve(int limit)
{
int group=1,sum=0;
for(int i=1;i<=n;i++){
if(sum+money[i]<=limit){
sum+=money[i];
}else{
group++;
sum=money[i];
}
}
if(group>m){
return false;
}else{
return true;
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
int lb=0,ub=0;
for(int i=1;i<=n;i++){
scanf("%d",&money[i]);
ub+=money[i];
if(lb<money[i]){
lb=money[i];
}
}
ub++;lb--;
while(ub-lb>1){
int mid=(lb+ub)>>1;
if(solve(mid)){
ub=mid;
}else{
lb=mid;
}
}
printf("%d\n",ub);
}
return 0;
}