#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;
}
#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;
}
本文介绍了一个计算气球浪费量的C程序。该程序通过输入不同规格的气球包及各队伍所需各色气球数量来计算最小浪费量。程序利用向上取整、模运算等数学方法确保了计算准确性。

6161

被折叠的 条评论
为什么被折叠?



