题目简要:
小鲍勃喜欢和他的盒砖一起玩。他把砖块放在另一块砖上,构建不同高度的堆叠。“看,我已经修了一堵墙!”,他告诉他的姐姐爱丽丝。“”不,你应该使所有的堆栈都相同的高度。然后你会有一个真正的墙。“她反驳。经过一点考虑,鲍勃看到她是对的。所以他开始一个一个地重新排列砖块,使所有的堆栈之后是相同的高度。但是因为鲍勃是懒惰的,他想用最少的砖块移动这样做。你能帮我吗?
小鲍勃喜欢和他的盒砖一起玩。他把砖块放在另一块砖上,构建不同高度的堆叠。“看,我已经修了一堵墙!”,他告诉他的姐姐爱丽丝。“”不,你应该使所有的堆栈都相同的高度。然后你会有一个真正的墙。“她反驳。经过一点考虑,鲍勃看到她是对的。所以他开始一个一个地重新排列砖块,使所有的堆栈之后是相同的高度。但是因为鲍勃是懒惰的,他想用最少的砖块移动这样做。你能帮我吗?
输入
输入由多个数据集组成。每个集合以包含Bob已经构建的堆栈的数目n的行开始。下一行包含n个数字,n个堆栈的高度hi。您可以假设1 <= n <= 50和1 <= hi <= 100。
砖的总数将被堆叠的数量整除。因此,总是可以重新布置砖,使得所有堆叠具有相同的高度。
输入由以n = 0开始的集合终止。不应处理此集合。
输入由以n = 0开始的集合终止。不应处理此集合。
输出
对于每个集合,首先打印集合的编号,如示例输出中所示。然后打印行“最小移动数为k”,其中k是为了使所有堆栈具有相同高度而必须移动的砖块的最小数量。
在每个集合后输出一个空行。
例如:
例如:
Sample Input
6
5 2 4 1 7 5
0
5 2 4 1 7 5
0
Sample Output
Set #1
The minimum number of moves is 5.
The minimum number of moves is 5.
解题思路:
看到这道题,既然要找最少移动数,就只要把大于平均数的数,给小于平均数的数匀几个。所以只要求出大于平均数的数减去平均数的和就能求出最小移动数。
思路不难,写程序也不难。
然而,在写的过程中,我还是出现了疏忽。一开始,写完提交一直wrong answer。我也一直搞不懂为什么,最后,当我输入50,50个2是出现0后,以后在输入无论任何数据,得到的答案都是0,终于发现了问题。几个量的初值应该在while内赋值。改过来后顺利通过。
思路不难,写程序也不难。
然而,在写的过程中,我还是出现了疏忽。一开始,写完提交一直wrong answer。我也一直搞不懂为什么,最后,当我输入50,50个2是出现0后,以后在输入无论任何数据,得到的答案都是0,终于发现了问题。几个量的初值应该在while内赋值。改过来后顺利通过。
附代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,i,j=1,a[55],sum,ave,answer;
while(cin>>n&&n!=0)
{
sum=ave=answer=0;
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=0;i<n;i++)
{
sum=sum+a[i];
}
ave=sum/n;
for(i=0;i<n;i++)
{
if(a[i]>ave)
{
answer=answer+(a[i]-ave);
}
}
cout<<"Set #"<<j<<endl<<"The minimum number of moves is "<<answer<<'.'<<endl<<endl;
j++;
}
return 0;
}
using namespace std;
int main()
{
int n,i,j=1,a[55],sum,ave,answer;
while(cin>>n&&n!=0)
{
sum=ave=answer=0;
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=0;i<n;i++)
{
sum=sum+a[i];
}
ave=sum/n;
for(i=0;i<n;i++)
{
if(a[i]>ave)
{
answer=answer+(a[i]-ave);
}
}
cout<<"Set #"<<j<<endl<<"The minimum number of moves is "<<answer<<'.'<<endl<<endl;
j++;
}
return 0;
}
解题感受:
这道题真折磨人,由于一个赋值位置的问题,一直耗到凌晨1点多才A掉。细节问题在一开始写的时候就一定要注意,不然,后来再改,真的很难看出来···