题目链接:https://loj.ac/problem/10014
分析:对于结果,两种极限情况
第一种,N个数,分了N组,此时的结果为N个数的最大值
第二种,N个数分了1组,最大值为N个数的和。
从这两种极值出发,进行二分。对应每一个值的分组情况,从而确定区间
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int mi;
int N,M,a[100004];
int solve(int x)
{
int sum=0,ans=1;
for(int i=0; i<N; i++)
{
sum+=a[i];
if(sum>x)
{
ans++;/*ans为分组的数量*/
sum=a[i];
}
}
if(ans>M)/*说明分小了*/
return 0;
else
return 1;
}
int main()
{
scanf("%d%d",&N,&M);
int l=0,r=0;
for(int i=0; i<N; i++)
{
scanf("%d",&a[i]);
l=max(l,a[i]);/*两种极值情况*/
r+=a[i];
}
while(l<r)
{
int mid=(l+r)>>1;/*对于每一种结果看能分几组*/
if(solve(mid))
r=mid;
else
l=mid+1;
}
printf("%d\n",r);
return 0;
}