nyoj680摘枇杷

来源:互联网 发布:淘宝gxg官方店是正品吗 编辑:程序博客网 时间:2024/04/27 18:48
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=680
或者: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;}


1 0
原创粉丝点击