二分,至今仍很纠结
#include <stdio.h>
#define maxn 100010
int n,m;
int judge(int mid,int* ex)
{
int gr=1;//!!!!!!!!!!!!
int sum=0;
int i;
for(i=0;i<n;i++)
{
if((sum+ex[i])<=mid)
{
sum+=ex[i];
}
else
{
gr++;
sum=ex[i];//!!!!!!!!!!
}
}
if(gr>m) return 1;//说明小了
else return 0;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
scanf("%d",&m);
int ex[maxn];
int i;
int high=0,low=0;
for(i=0;i<n;i++)
{
scanf("%d",&ex[i]);
if(low<ex[i]) low=ex[i];//下界能分成n组
high+=ex[i];
}
high++;//上界能分成1组
int mid;
while(low<high)
{
mid=low+(high-low)/2;
if(judge(mid,ex))
low=mid+1;
else
high=mid;
}
printf("%d\n",high);//输出high和low都可以
}
return 0;
}