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;
}