我的二分之路(1)

来源:互联网 发布:java中两个list拼接 编辑:程序博客网 时间:2024/05/17 00:00

题目
拿到题目我最先想到的是暴利枚举区间搜索满足条件的最小值,然而看了下数据范围,知道这不是一个能够通过暴力解决的题目。必须对其进行优化,但是题目条件有每天的金额ai,fajomonths数量m;这样我们稍微考虑下就知道可以对每个fajomonths的金额通过二分进行枚举(每个fajomonths的金额必定在最大的a[i]跟所有金额之和sum之间),然后判断能否将所有的数据分割成m份,如此实现二分。

#include<iostream>#include<string.h>#include<math.h>#include<cstdio>#include<algorithm>#define MAX 100010using namespace std;int a[MAX];int judge(int mid,int n,int m){    int sum=0;    int cot=1;    for(int i=1;i<=n;i++)    {        if(sum+a[i]<mid)        {            sum+=a[i];        }        else        {            sum=a[i];            cot++;        }    }    return cot;}int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {        int r=0;        int l=0;        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i]);            r+=a[i];            if(l<a[i])                l=a[i];        }        int mid;        while(l<=r)        {            mid=(l+r)/2;            if(judge(mid,n,m)<=m) r=mid-1;            else l=mid+1;        }        cout<<mid<<endl;    }}
0 0
原创粉丝点击