您的位置:首页 > 其它

2015NCHU第一届ACM新生选拔赛E题题解

2015-04-06 10:42 260 查看
#include<stdio.h>

#include<string.h>

#include<math.h>

int normal[1010]; //存储气球规格的数组

int sumColor[11]; //存储各种颜色气球的使用量

int main()

{

int t; //测试样例组数

int n; //规格种数

int m; //队伍数

int tmp; //辅助变量

int minRemain; //最小气球浪费量

int remain; //当前气球浪费量

scanf("%d", &t);

while( t-- )

{

scanf("%d", &n);

for( int i = 0; i < n; i++ )

{

scanf("%d", &normal[i]);

}

scanf("%d", &m);

memset(sumColor, 0, sizeof(sumColor));

for( int i = 0; i < 10; i++ )

{

for( int j = 0; j < m; j++ )

{

//统计气球使用量

scanf("%d", &tmp);

sumColor[i] += tmp;

}

}

//因为气球的最大使用量不会超过全场队伍都AK时的使用量,也即10m,所以赋值10*m+1是符合要求的

minRemain = 10 * m + 1;

//依次对每一种规格进行计算

for ( int i = 0; i < n; i++ )

{

//依次统计每一种颜色气球的浪费量

remain = 0;

for ( int j = 0; j < 10; j++ )

{

/*

* 气球的剩余量 = 气球的购买量 - 气球的使用量

* 气球的购买量 = 所需要购买的气球袋数 * 每一袋气球的数量

* 所需要购买的气球袋数 = 气球的使用量 / 每一袋气球的数量(注意这里的除法是向上取整)

* 所以气球的剩余量 = 气球的使用量 / 每一袋气球的数量 * 每一袋气球的数量 - 气球的使用量,即

* remain = (int)ceil((double)sumColor[j] / (double)normal[i]) * normal[i] - sumColor[j] )

*

* 而我们知道,气球是可以回收的,并且气球的回收量是每一袋气球数量的整数倍

* 也即 k * normal[i],所以气球使用量对normal[i]求余所得的余数就是不能回收的数量

* 所以气球的真正浪费量 = 气球的剩余量 mod 每一袋气球的数量,即

* remain = ( (int)ceil((double)sumColor[j] / (double)normal[i]) * normal[i] - sumColor[j] ) % normal[i]

* 对每一种颜色的气球进行remain值的累积就是所求的答案

*/

remain += ( (int)ceil((double)sumColor[j] / (double)normal[i]) * normal[i] - sumColor[j] ) % normal[i];

}

//更新最小值

minRemain = remain < minRemain ? remain : minRemain;

}

//当最小值为零的时候就是表明气球没有浪费

if ( minRemain ) printf("%d\n", minRemain);

else printf("No waste\n");

}

return 0;

}

复制去Google翻译翻译结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: