167. [USACO Mar07] 月度花费

来源:互联网 发布:100 是淘宝极限词吗 编辑:程序博客网 时间:2024/05/18 13:06

COGS167月度花费

链接http://www.cojs.tk/cogs/problem/problem.php?pid=167
二分答案
没用用到前缀和,直接将答案进行二分,当当前这一段序列和大于正在尝试的答案时,flag++;表示进入下一个组别,最后跳出循环式,比较flag和题目中给的分组数m,如果flag小于m,显然这个mid太大了,将右边界=mid-1;一定要将cnt和flag置为0。

#include<iostream>#include<cstdio>using namespace std;int n,m;int sum;int a[100000+10];int b[100000+10];int cir[100000+10];int flag;int ll;void read(){    freopen("expense.in","r",stdin);    freopen("expense.out","w",stdout);    cin>>n>>m;    for(int i=1;i<=n;++i)    {        cin>>a[i];        sum+=a[i];        ll=max(ll,a[i]);        cir[i]=cir[i-1]+a[i];    }}int solve(int l,int r){    int mid;    int cnt=0;    while(l<r)    {        mid=(l+r)>>1;        for(int i=1;i<=n;++i)        {            cnt+=a[i];            if(cnt+a[i+1]>mid) {flag++;cnt=0;}        }        if(flag<m) r=mid-1,flag=0,cnt=0;//注意清零        else l=mid+1,flag=0,cnt=0;    }    return l;}int main(){    read();    cout<<solve(ll,sum);    return 0;}
1 0
原创粉丝点击