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 ;
}

你可能感兴趣的:(poj)