题意:给出n天每天需要花费的钱,将n天分为m组,每一组的天数都是连续的,要使m组中花费最多的一组最少,求m组中花费花费最多的一组花费了多少钱。
题记:答案的范围在n组中的最大值(将n天分为n组)开始到n组的总和(将n天分为1组),直接从这个范围中二分即可。
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N];
int n,m;
int check(int x){
int sum=0,ans=1;
for(int i=0;i<n;i++){
if(sum+a[i]<=x) sum+=a[i];
else{
ans++;
sum=a[i];
}
}
return ans;
}
int bsearch(int l,int r){
while(l<r){
int mid=l+r>>1;
if(check(mid)>m)l=mid+1;
else r=mid;
}
return l;
}
int main(){
cin>>n>>m;
int mx=0,sum;
for(int i=0;i<n;i++){
cin>>a[i];
mx=max(a[i],mx);
sum+=a[i];
}
cout<<bsearch(mx,sum)<<endl;
return 0;
}