题目描述
有 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).
输入
输入文件中包括两行数据.
第一行为 N 堆纸牌数 (1<=N<=100).
第二行为 N 堆纸牌中每堆纸牌初始数 A1,A2,...,An(l<=Ai<=10000).
输出
- #include<cstdio>
- using namespace std;
- int main()
- {
- int n,a[105],s=0;
- scanf("%d",&n);
- for(int i=0;i<n;i++)
- {
- scanf("%d",&a[i]);
- s+=a[i];
- }
- int avg=s/n;
- for(int i=0;i<n;i++)
- a[i]-=avg;
- int ans=0;
- for(int i=0;i<n-1;i++)
- {
- if(a[i]==0)
- continue;
- ans++;
- a[i+1]+=a[i];
- }
- printf("%d\n",ans);
- return 0;
- }
- View Code
来源: http://www.bubuko.com/infodetail-2713535.html