题意:把n个月的花费分成m段,找出不同划分情况中和最大的一段的最小情况。
二分查找,答案显然在a[n]的最大值和n个月花费总和之间,在这两者之间用二分查找答案。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;
int a[100005];
int main()
{
int n,m;
cin>>n>>m;
int sum=0;
int ans=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
sum+=a[i];
ans=max(ans,a[i]);
}
while(sum>ans)
{
int mid=(sum+ans)/2;
int cnt=0,temp=0;
for(int i=0;i<n;i++)
{
temp+=a[i];
if(temp>mid)
{
temp=a[i];
cnt++;
}
}
if(cnt<m)
sum=mid;
else ans=mid+1;
}
cout<<ans<<endl;
return 0;
}