poj 3273 Monthly Expense

二分。。判断出口的写法有很多。。看了别人的方式觉得蛮有哲学的。
心烦的是因为太急导致数组少了一个0也是醉。。。

#include<stdio.h>
int money[100010];
int main()
{
    int n,m;
    int max=0;
    scanf("%d%d",&n,&m);
    int i;
    int sum=0;
    for(i=1;i<=n;i++)
        {
            scanf("%d",&money[i]);
            if(money[i]>max)
                max=money[i];
            sum=sum+money[i];
        }
    int left=max;//ans一定比最大值还要大啦//
    int right=sum;//ans一定比总和要小啦//
    int mid;
    int ans=sum;//这是我无脑的猜测,请忽略//
    while(left<=right)
    {
        mid=(left+right)/2;
        int s=0;
        int count=1;//觉得这里很重要。虽然扳扳手指头就可以出来//
        for(i=1;i<=n;i++)
        {
            s=s+money[i];
            if(s>mid)
            {
               s=money[i];//超过了,就以当下为起点//
               count++;
            }
        }
        if(count>m)
        {
            left=mid+1;
        }
        else
        {
            ans=mid;
            right=mid-1;
        }
    }
    printf("%d\n",ans);
    return 0;
}

你可能感兴趣的:(poj,二分)