POJ3273 http://poj.org/problem?id=3273
关键词:最大值最小化
题目大意:给N个数字,求划分成M组(每组数字需要连续)后,每组尽可能小,输出和数的最大值。
解题思路:
从最大值到总和按照组数进行二分查找。
AC代码:
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn = 100000 + 5;
int n, m, sum, l, r, grp;
int d[maxn];
bool judge(int mid) {
int sum = 0;
int grp = 1;
for(int i = 1; i <= n; i++) {
if(sum + d[i] <= mid) sum += d[i];
else {
sum = d[i];
grp++;
}
}
if(grp > m) return false;
else return true;
}
int main() {
while(cin >> n >> m) {
for(int i = 1;i <= n; i++) {
cin >> d[i];
r += d[i];
if(d[i] > l) l = d[i];
}
int mid = (l + r) >> 1;
while(l < r) {
if(!judge(mid)) l = mid + 1;
else r = mid - 1;
mid = (l + r) >> 1;
}
cout << mid << endl;
}
return 0;
}