Problem A. 均分纸牌
时间限制 1000 ms
内存限制 128 MB
题目描述
有 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 ( N 堆纸牌, 1 ≤ N ≤ 100 )
A1 A2 … An ( N 堆纸牌,每堆纸牌初始数, l≤ Ai < 104 )
输出数据
所有堆均达到相等时的最少移动次数。
样例输入
4
9 8 17 6
样例输出
3
import java.util.Scanner;
// Author :
// Time : 2019/11/20 8:50
// File : Card.java
// Describe : 均分纸牌
// IDE : IntelliJ IDEA
//求解思路:用差值来表示,平均数为10,依次求解
public class Card {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();//测试数据的组数
int initData[] = new int[N];//存放原始数据
// int averData[] = new int[N];// 存放差值
int averageNumber = 0;//求平均数
int step = 0;// 具体操作的步数
for (int i = 0; i < N; i++) {
initData[i] = in.nextInt();
averageNumber += initData[i];//求和
}
averageNumber = averageNumber / N;//求平均数
for (int i = 0; i < N; i++) {
initData[i] = initData[i] - averageNumber; //存放差值
}
// System.out.println(averData[2]);//测试数据操作是否成功
for (int i = 0; i < N; i++) {
if (initData[i]==0){ //将所有的值追加为0
continue;
}
initData[i+1]=initData[i]+initData[i+1];
// System.out.println("***"+initData[i]+"**"+i);
step++;
}
System.out.println(step);
in.close();
}
}