题解byzzq_helloworld
这是接下来讲题用的文档转化而来的题解,想要学习的可以看过来。
虽说是提高组的题目,但真的很简单啊(bushi)
纸牌游戏有N堆纸牌,编号分别为1,2,…,N。每堆上有若干张纸牌,纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动到另一堆。移牌规则为:在编号为1的堆上取的纸牌,只能移到编号为 2的堆上;在编号为 N的堆上取的纸牌,只能移到编号为 N-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如 N=4,4 堆纸牌数分别为: ① 9 ② 8 ③ 17 ④ 6。 移动3次可达到目的: 从 ③ 取4张牌放到 ④ (9,8,13,10)→ 从 ③ 取 3 张牌放到 ②(9,11,10,10)→
纸牌游戏有N堆纸牌,编号分别为1,2,…,N。每堆上有若干张纸牌,纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动到另一堆。移牌规则为:在编号为1的堆上取的纸牌,只能移到编号为 2的堆上;在编号为 N的堆上取的纸牌,只能移到编号为 N-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如 N=4,4 堆纸牌数分别为: ① 9 ② 8 ③ 17 ④ 6。 移动3次可达到目的: 从 ③ 取4张牌放到 ④ (9,8,13,10)→ 从 ③ 取 3 张牌放到 ②(9,11,10,10)→ 从 ② 取 1 张牌放到①(10,10,10,10)。从 ② 取 1 张牌放到①(10,10,10,10)。
输入格式:
输入第1行为一个整数N(1≤N≤100)。 第2行为N个数,表示每堆纸牌初始数A1,A2,…,An(l≤Ai≤10 000)。
所有堆的牌数均达到相等时的最少移动次数。
这道题的基础想法为:
那就可以写代码了。
参考代码如下:
for(int i=0; i<n; i++)
sum+=a[i];
int num=sum/n;
for(int i=0; i<n; i++)
a[i]-=num;
for(int i=0; i<n-1; i++)
{
ans++;
a[i+1]+=a[i];
}
结果交上去,听取WA声一片。才二十分!(不是吧,不是吧)
这是为啥呢?--原因很简单,没有处理0。
完整参考代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n];
for(int i=0; i<n; i++)
cin>>a[i];
int ans=0;
int sum=0;
for(int i=0; i<n; i++)
sum+=a[i]; // 算出总的牌数
int num=sum/n; // 算出平均牌数
for(int i=0; i<n; i++)
a[i]-=num; // 把每一堆牌数减去平均牌数
for(int i=0; i<n-1; i++)
{
if(a[i]!=0) // 如果不等于平均的牌数,则移动
{
ans++;
a[i+1]+=a[i]; // 移动
}
}
cout<<ans<<endl;
return 0;
}
请大家根据以上分析,AC掉它。