POJ 3273 Monthly Expense【二分答案】

来源:互联网 发布:骂淘宝客服有什么后果 编辑:程序博客网 时间:2024/06/08 17:53

题意:输入n,m,接着输入接下来n天的花费,为这些天数分组,求每组的最少花费【限制组数不能大于m】

二分目标钱数,再模拟分组,组数太少就是钱不够,+钱,反之减钱

赶脚理解题意比做题还难,轻松1Y

        //79MS#include <iostream>#include <cstdio>#include <cmath>using namespace std;int m,n;int a[100010];int too(int mid){    int cnt = 0, res = 1;    for(int i=0;i<n;i++)    {        if( a[i] >  mid)//钱不够用,肯定不行,要增钱,l=mid+1;            return 1;        if( cnt + a[i] <= mid )        {                   //模拟分组            cnt += a[i];        }else        {            cnt = a[i];            res++;        }    }    return res > m;}int main(){   // freopen("in.txt","r",stdin);    int r,l,mid;    while(scanf("%d%d",&n,&m)!=EOF)    {        int sum = 0;        for(int i=0;i<n;i++){            scanf("%d",&a[i]);            sum+=a[i];        }        l = 0,r = sum;        while( l < r)        {            mid = (l + r)/2;            if(too(mid))                l = mid+1;            else                r = mid ;        }        printf("%d\n",l);    }    return 0;}

三组数据

2 1191 1219 19101079812559395106474
输出10,2,123

0 0
原创粉丝点击