http://poj.org/problem?id=3273
将数列中的元素分组 使得分组后和的最大值最小 采用二分答案的方法穷举。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int N,M,a[100010],ans;
bool check(int mid){
int sum = 0,cnt = 1;
for(int i=1; i<=N; i++){
if(sum + a[i] <= mid)
sum += a[i];
else{
sum = a[i];
cnt++;
}
}
return cnt <= M;
}
int main(){
// freopen("in.txt", "r", stdin);
scanf("%d%d",&N,&M);
int sum = 0,left = 0, right;
for(int i=1; i<=N; i++){
scanf("%d",&a[i]);
sum += a[i];
left = max(left, a[i]);
}
right = sum;
while(left <= right){
int mid = (left + right) >> 1;
if(check(mid)){
ans = mid;
right = mid - 1;
}
else
left = mid + 1;
}
printf("%d\n",ans);
}