题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=680
或者:http://115.159.40.116/problem_show.php?pid=5264
题目大意就是将n个数组成的一列,分成m份,使m份中最大的那份中所有数的和尽量小,如下例:
或者:http://115.159.40.116/problem_show.php?pid=5264
题目大意就是将n个数组成的一列,分成m份,使m份中最大的那份中所有数的和尽量小,如下例:
n=7 m=5 数据为: 1 4 3 1 5 2 4 答案: 5
分为1+4,3+1,5,2,4
AC代码:
#include <stdio.h>
#include <math.h>
int m, n, num[1005];
int Judge(int avg){
int i = 0, s = 0, con = 0;
for(; i < n; i++){
if(s+num[i] > avg){
s = 0;
con++;
}
s += num[i];
}
if(i == n && con < m) return 1;//当份数等于m时自然是符合的,因最后一组未con++,故用con<m
//当份数<m时,可以将!=avg的其他份拆了直至m份,这时也符合
//代码没有考虑输入数据有误时的情况,如数据个数为2,分成3份;对于此情况 上述return 1条件不适用
return 0;
}
int main(){
int i, avg;
while(~scanf("%d%d", &n, &m)){
int sum = 0, max = -1;
for(i = 0; i < n; i++){
scanf("%d", &num[i]);
sum += num[i];
if(num[i] > max) max = num[i];
}
avg = ceil(sum*1.0/m);//向上取整
if(max > avg) avg = max;
//如果数组中有大于平均值的数直接从max开始循环,否则从avg开始++寻找
while(avg <= sum){
if(Judge(avg)) break;
avg++;
}
printf("%d\n", avg);
}
return 0;
}