描述
输入
输出
输入样例
输出样例
样例解释
给你一个长度为N的序列,现在要让你把他们切割成M份(所以每一份都是连续的),然后每一份都有一个和sum[i],其中最大的一个是maxSum = max(sum[i]),问这个最大值最小是多少?
多组输入输出
每组数据第一行是2个整数N,M(1<=M<=N<=100000),接着是N行,每行一个整数vi,表示这个序列.
每组数据输出一行一个数,为这个最大值最小是多少
7 5
100
400
300
100
500
101
400
500
对于样例,你可以把100,400分成第一组,300,100分成第二组,500分成第三组,101分成第四组,400分成第五组,他们的和最大的是500。
最大值的最小化问题,简单二分,自我感觉难点应该是如何写judge()函数。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int N, M;
int num[100005];
int judge(int x) {
int sum = 0, s = 0;
for(int i = 0; i < N; i++) {
if(s + num[i] <= x) {
s += num[i];
if(i == N-1) sum++;
}
else {
sum++;
s = 0;
i--;
}
}
if(sum > M) return 0;
return 1;
}
int main() {
scanf("%d %d", &N, &M);
int left = 0, right = 0, mid;
for(int i = 0; i < N; i++) {
scanf("%d", &num[i]);
if(left < num[i]) left = num[i];//左边
right += num[i]; //右边
}
while(left + 4 < right) {
mid = (left + right)/2;
if(judge(mid)) right = mid;
else left = mid;
}
for(int i = left; i <= right; i++) {
if(judge(i)) {
printf("%d\n", i);
break;
}
}
return 0;
}