原題鏈接
http://poj.org/problem?id=3273
題意
給你和的值,代表天,讓你將這天恰好分成段連續和,讓這段和裏面的最大值最小。
思路
因爲這個和具有單調性,二分答案,即二分最大連續和,下界取天的最大值,上界取天的和,從而找到最優值。
參考代碼
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
int n, m, a[100005];
bool check(int mid) {
int sum = 0, num = 1; //查詢每組上限爲mid的情況下的組數
for (int i = 1; i <= n; i++) {
if (sum + a[i] <= mid) {
sum += a[i];
} else {
sum = a[i];
num++;
}
}
return num > m; //組數偏大,說明mid偏小
}
int main() {
scanf("%d%d", &n, &m);
int maxn = -1, sum = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
maxn = max(maxn, a[i]);
sum += a[i];
}
int l = maxn, r = sum;
int mid = (l + r) / 2;
while (l < r) {
if (check(mid)) {
l = mid + 1;
} else {
r = mid - 1;
}
mid = (l + r) / 2;
}
printf("%d\n", mid);
return 0;
}