poj 3273 Monthly Expense

来源:互联网 发布:linux装vim 编辑:程序博客网 时间:2024/05/21 12:56

http://poj.org/problem?id=3273


解题思路:

   块的和最小大于最大数值,最大小于数值总和。因此,我们首先判断块的上限值(即我们要求的值),以该上限判断结果的划分是否符合要求。若划分的块数大于M,则我们二分式地减小这个上限;反之我们二分式地增加这个上限。


#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define max 100001int day[max];int n,m;int main(){    int i,j;    int sum,cnt,ma,low,high,mid;    while(~scanf("%d %d",&n,&m))    {        memset(day,0,sizeof(day));        sum=0;        ma=0;        for(i=0;i<n;i++)        {            scanf("%d",&day[i]);            if(day[i]>ma)            {                ma=day[i];            }            sum+=day[i];        }        low=ma;        high=sum;        while(low<=high)        {            mid=(low+high)/2;            sum=0;            cnt=1;            for(i=0;i<n;i++)            {                sum+=day[i];                if(sum>mid)                {                    sum=day[i];                    cnt++;                }            }            if(cnt<=m)            {                ma=mid;                high=mid-1;            }            else                low=mid+1;        }        printf("%d\n",ma);    }    return 0;}


0 0
原创粉丝点击