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翻译翻译结果
#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翻译翻译结果
相关文章推荐
- 2015NCHU第一届ACM新生选拔赛A题题解
- 2015NCHU第一届ACM新生选拔赛B题题解
- 2015NCHU第一届ACM新生选拔赛C题题解
- 2015NCHU第一届ACM新生选拔赛D题题解
- 2015NCHU第一届ACM新生选拔赛F题题解
- 2015NCHU第一届ACM新生选拔赛G题题解
- 2015NCHU第一届ACM新生选拔赛H题题解
- 2015NCHU第一届ACM新生选拔赛J题题解
- 2015NCHU第一届ACM新生选拔赛I题题解
- 2015NCHU第一届ACM新生选拔赛赛题说明
- 2016Hrbust软件学院ACM新生选拔赛(一)
- ACM新生选拔赛第三场题解
- 山东省第一届ACM省赛 Emergency
- 2010年山东省第一届ACM大学生程序设计竞赛:shopping
- 山东省第一届ACM省赛 I SDUT 2159 Ivan comes again!(STL-set)
- 20130820 【南华大学 ACM】 个人选拔赛第二场 【C . DOBRI】
- 2010年山东省第一届ACM大学生程序设计竞赛——Clockwise
- nyist——ACM新生牛刀小试 Round#1题解
- HDOJ1029 Ignatius and the Princess IV【AC率最高的一题】-----武科大ACM暑期集训队选拔赛3题
- 华东交通大学2016届新生选拔赛:1001 最大的空地