您的位置:首页 > 其它

普及练习场 交叉模拟 均分纸牌

2017-12-11 22:50 239 查看
题目链接

题意理解

这个我想的话,是直接从左到右看,少了就从右边补,多了就往右边加。因为我觉得是可以调整操作顺序,使得牌数量不会不够减的。就是一个置换嘛,毕竟置换不改变最后的结果,但是可以改变中间的过程。至于为什么这个解是正确的,我只能说,我想到了这个算法之后交了一发,全过了。。。我其实不是很会证明这个正确性,但是可以简单说一下:1.证明步数最少。这个我想不出来。。。2.置换后一定可以保证每堆牌的数量是正数/零。这个我也想不出来。。。不过我YY了一下,如果有多的必定有少的,有多的就让多的多借几张出来。。。

总之这题我完全是靠直觉写的题目并且过掉的

代码

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int[] a = new int[N + 1];
int sum = 0;
for (int i = 1; i <= N; i++) {
a[i] = scanner.nextInt();
sum += a[i];
}
scanner.close();
int avg = sum / N;
int cnt = 0;
for (int i = 1; i <= N; i++) {
if (a[i] < avg) {
int delta = avg - a[i];
a[i] += delta;
a[i + 1] -= delta;
cnt++;
} else if (a[i] > avg) {
int delta = a[i] - avg;
a[i] -= delta;
a[i + 1] += delta;
cnt++;
}
}
System.out.println(cnt);

}

}


欢迎加入“不会算法一群菜鸟”,群号是⑥⑥①⑨②2025,这是我设置的一道很低的门槛用来阻止广告的。入群的验证暗号是:我爱编译原理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: