《ACM程序设计》书中题目 K

题目简要:
   小鲍勃喜欢和他的盒砖一起玩。他把砖块放在另一块砖上,构建不同高度的堆叠。“看,我已经修了一堵墙!”,他告诉他的姐姐爱丽丝。“”不,你应该使所有的堆栈都相同的高度。然后你会有一个真正的墙。“她反驳。经过一点考虑,鲍勃看到她是对的。所以他开始一个一个地重新排列砖块,使所有的堆栈之后是相同的高度。但是因为鲍勃是懒惰的,他想用最少的砖块移动这样做。你能帮我吗?
输入
输入由多个数据集组成。每个集合以包含Bob已经构建的堆栈的数目n的行开始。下一行包含n个数字,n个堆栈的高度hi。您可以假设1 <= n <= 50和1 <= hi <= 100。
砖的总数将被堆叠的数量整除。因此,总是可以重新布置砖,使得所有堆叠具有相同的高度。
输入由以n = 0开始的集合终止。不应处理此集合。
输出
对于每个集合,首先打印集合的编号,如示例输出中所示。然后打印行“最小移动数为k”,其中k是为了使所有堆栈具有相同高度而必须移动的砖块的最小数量。
在每个集合后输出一个空行。
例如:

Sample Input
6
5 2 4 1 7 5
0

Sample Output
Set #1
The minimum number of moves is 5.
 
解题思路:
 
  看到这道题,既然要找最少移动数,就只要把大于平均数的数,给小于平均数的数匀几个。所以只要求出大于平均数的数减去平均数的和就能求出最小移动数。
思路不难,写程序也不难。
  然而,在写的过程中,我还是出现了疏忽。一开始,写完提交一直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;
}

解题感受:
 这道题真折磨人,由于一个赋值位置的问题,一直耗到凌晨1点多才A掉。细节问题在一开始写的时候就一定要注意,不然,后来再改,真的很难看出来···


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值