POJ 3273:Monthly Expense(二分)

来源:互联网 发布:云平台软件销售协议 编辑:程序博客网 时间:2024/05/16 11:13

大致题意:

给出农夫在n天中每天的花费,要求把这n天分作m组,每组的天数必然是连续的,要求分得各组的花费之和应该尽可能地小,最后输出各组花费之和中的最大值。

题解:

做了这道题,我才深刻理解到上午学长讲二分时说的那么一句话啦。当给出条件,但直接求出答案不容易,验证答案很容易且答案区间已知是,二分区间验证答案是个很有效的策略!!!

那么这道题最终答案的区间就在[Max,sum]中(其中Max代表所有书中最大值,sum代表所有数求和)

下面就是AC的代码,要注意的就是一对区间的二分和答案的输出


#include <iostream>#include <stdio.h>#include <math.h>#include <cstring>#include <map>#include <set>#include <algorithm>#include <queue>#include <stack>using namespace std;int spend[100003];int main(){    int N,M,Max,sum,mid;    while(scanf("%d%d",&N,&M)!=EOF){        scanf("%d",&spend[0]);        Max=sum=spend[0];        for(int i=1;i<N;i++){            scanf("%d",&spend[i]);            Max=max(Max,spend[i]);            sum+=spend[i];        }        while(Max<sum){            mid=(sum+Max)/2;            int cnt=0,s=0;            for(int j=0;j<N;j++){                s+=spend[j];                if(s>mid){                    s=spend[j];                    cnt++;                }                if(j==N-1)                    cnt++;            }            //cout<<mid<<" "<<cnt<<endl;;            if(cnt>M)                Max=mid+1;            else                sum=mid;        }        printf("%d\n",Max);    }    return 0;}



0 0
原创粉丝点击