您的位置:首页 > 其它

poj 3273 Monthly Expense(二分穷举)

2013-02-20 20:23 253 查看
题目:http://poj.org/problem?id=3273

题意:把n天分为m组,每组的天数是连续的,求每组花费之和最小

二分穷举,把花费的最大值和最小值求出,对其进行二分,从而求出符合要求的最小花费

View Code

#include <iostream>
#include<cstdio>
using namespace std;
int a[100010];
int n,m;
int juge(int mid)
{
int sum=0;
int num=1;
int i;
for(i=0;i<n;i++)
{
if(sum+a[i]<=mid)
sum+=a[i];
else
{
sum=a[i];
num++;
if(num>m)
return 0;
}
}
return 1;
}
int main()
{
scanf("%d %d",&n,&m);
int i;
int low=0;
int high=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
high+=a[i];
if(a[i]>low)
low=a[i];
}
int mid;

while(low<high)
{
mid=(low+high)/2;
if(juge(mid))//如果mid可以将n分成m组,证明所求值在low到mid之间
high=mid-1;
else
low=mid+1;

}
mid=(low+high)/2;
cout<<mid<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: