poj 3273

来源:互联网 发布:大数据基础平台架构 编辑:程序博客网 时间:2024/06/06 08:48

题目链接:http://poj.org/problem?id=3273

题意: 一个n个元素的序列,要求分成连续的m组,使得每组和最大的那一组的和最小。

思路: 二分答案,之后再贪心的来判断(从头开始如果出现连续的和大于答案的话就将之前的元素分成一组,最后看所分的组数是否大于m)。

整体的复杂度是o(nlogn).

#include <cstdio>#include <cstdlib>#include <iostream>using namespace std;const int maxn=1000010;typedef long long LL;int n,m;LL cc[maxn];bool jud(LL key){    int cnt=0;    LL sum=0;    for(int i=0;i<n;i++){        sum+=cc[i];        if(sum>key){            cnt++;            sum=cc[i];        }    }    return (cnt+1)<=m? 1:0;}int main(){    //freopen("input.txt","r",stdin);    LL st,ed,mid;    bool flag;    while(scanf("%d%d",&n,&m)!=EOF){        st=ed=0;        for(int i=0;i<n;i++){            scanf("%lld",&cc[i]);            ed+=cc[i];            st=max(st,cc[i]);        }        st--;ed++;        while(ed-st>1){            mid=(st+ed)/2;            flag=jud(mid);            if(flag) ed=mid;            else st=mid;        }        printf("%lld\n",ed);    }    return 0;}



0 0
原创粉丝点击