您的位置:首页 > 其它

POJ3273 Monthly Expense(二分答案)

2015-05-15 13:07 337 查看
题目大意:

N个数不改变顺序分成M份,使每一份的和尽可能小

输出和中的最大值

很经典的二分答案,但是感觉二分很容易写错

先求出答案下界,也就是N个数中的最大值(相当于分成N份)

再求出答案上界,也就是N个数的和(相当于分成1份)

二分枚举可能的值

以这个值为和最大值,顺序遍历N个数,求出可以分多少份

如果份数大于M,则将上界往前移

如果份数小于等于M,则将下界往后移

(因为求的是份数等于M的最小值)

#include <stdio.h>
#define MAXN 100010

int arr[MAXN];

int main()
{
int i,n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int cnt,sum,mid,left=0,right=0;
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
right+=arr[i];
left=arr[i]>left?arr[i]:left;
}
while(left<right)
{
mid=(left+right)/2;
cnt=1,sum=0;
for(i=0;i<n;i++)
{
if(arr[i]+sum<=mid)
sum+=arr[i];
else
{
sum=arr[i];
cnt++;
}
}
if(cnt<=m)
right=mid;
else
left=mid+1;
}
printf("%d\n",left);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: