【POJ】3273

来源:互联网 发布:程序员 杂志 编辑:程序博客网 时间:2024/05/18 00:53

http://poj.org/problem?id=3273

将N个权值分割成K个区间,使得每个区间的全职和的最大值最小。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int a[100000];int N,K;int l=0,r=0;int ans;int main(){    cin >> N >> K;    for (int i=0;i<N;i++){        cin >> a[i];        r+=a[i];        l=max(l,a[i]);    }    while (l<r){        int mid=(l+r)>>1;        int t=1;        int cnt=0;        for (int i=0;i<N;i++){            if (t+a[i]<=mid){                t+=a[i];            }            else {                cnt++;                t=a[i];            }        }        if (cnt<K){            r=mid-1;        }        else l=mid+1;    }    cout << r << endl;}