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

#include
#include
#include


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;
}

你可能感兴趣的:(ACM-ICPC,acm)