http://acm.pku.edu.cn/JudgeOnline/problem?id=3273
把N天分为M段连续区域,求M段区域中的最小最大值。
其实自己还没怎么完全理解二分的实现,下面的代码是看别人写的。惭愧。
#include<stdio.h>
int main()
{
int N,M,max,min,mid,i,k,sum,money[100001];
while(scanf("%d%d", &N, &M)!=EOF)
{
max=0;
min=-1;
for(i=1; i<=N; i++)
{
scanf("%d", &money[i]);
max+=money[i];
if(min<money[i]) min=money[i];
}
//max为所有money的总和
//min为money里的最大值
while(min<max)
{
mid=(min+max)>>1;
sum=0;
k=0;
for(i=1; i<=N; i++)
{
sum+=money[i];
if(sum>mid)
{
sum=money[i];
k++;
}
}
//重新分配上下界
if(k<M) max=mid;
else min=mid+1;
}
printf("%d\n", max);
}
return 0;
}