摘枇杷
时间限制:
2000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
理工学院的枇杷快熟了,ok,大家都懂得。而且大家都知道,学校的枇杷树都是一列一列的。现在小Y同学已经在筹划怎么摘枇杷了。现在我们假设有一列枇杷树,而且每棵枇杷树上枇杷果的数量小Y都已经知道了。
假设现在有n棵枇杷树,小Y可以把这n棵枇杷树分成m组,每组枇杷果的数量是这组内每棵枇杷树上枇杷果数量的和。注意,每组的枇杷树必须是连续的。(每组最少1棵树,最多n棵树)。小Y把枇杷往寝室拿的时候是一组一组拿的,所花费的力气等于这m组中枇杷果最多的那组枇杷果的数量。现在小Y想花尽量少的力气把这些枇杷果拿回寝室。
-
输入
-
多组测试数据,以EOF结束(<= 100组)
每组测试数据第一行有两个数n(n <= 1000)和m(1 <=m <= n)
第二行有n个数,分别代表每颗树上枇杷果的数量
输出
- 输出小Y同学所花费的最小的力气,每个结果占一行。 样例输入
-
3 2 1 2 3 7 5 1 4 3 1 5 2 4
样例输出
-
3
5
-
//暴力二分 #include <stdio.h> int m, n, num[1001]; int check(int x) //判断每组容量为x是是否满足要求 { int i, cnt, sum; for(i = 0, sum = 0, cnt = 1; i < n; i++) { if(num[i] > x) //若出现比容量大的说明取小了 { return 0; } if(sum+num[i] > x) { cnt++; sum = num[i]; if(cnt > m) { return 0; } } else { sum += num[i]; } } return 1; //若正好也返回取大了,避免出现更小的更优解 } int binarySearch(int min, int max) //二分暴力查找 { int left = min, right = max, mid; while(left <= right) //注意这里应该 <= 保证结果尽量小(比较难理解) { mid = (left+right)/2; if(check(mid)) { right = mid-1; } else { left = mid+1; } } return left; } int main() { int i, sum, tmax; while(scanf("%d%d", &n, &m) != EOF) { tmax = 0; //两个边界 sum = 0; for(i = 0; i < n; i++) { scanf("%d", &num[i]); sum += num[i]; if(num[i] > tmax) { tmax = num[i]; } } printf("%d\n", binarySearch(tmax, sum)); //暴力二分搜索 } return 0; }
-
多组测试数据,以EOF结束(<= 100组)