poj 3273(二分)

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;
}
原文地址:https://www.cnblogs.com/submarinex/p/1941239.html