- 文件名:[作业]
- 作者:〈漆黑〉
- 描述:〈 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除。每个人可以给他左右相邻的人一些金币,最终使得每个人得金币数量相等。你的任务是求出被转手金币数量的最小值。
假设M为每个人都拥有的金币数,每个人的金币变化是左右相邻的人对其造成的影响
假设这n个人构成一个环,先假设n=4,设x1x1指1号给4号多少金币,则x2x2代表2号给1号
多少金币,其他的由此类推下去。
则对于1号来说,他给了4号金币,则剩a1−x1a1−x1
2号给了他金币,则剩a1−x1+x2a1−x1+x2
注意这里1号给4号和4号给1号的意义隐含在x1的符号里面(很巧妙),其他的类似
由于最后要等于M,然后就可以得方程了
a1−x1+x2=M>>x2=x1−(a1−M)=x1−C1》C1 = X1 - X2
a2−x2+x3=M>>x3=x2−(a2−M)=x1−a1−a2−2∗M=x1−C2》C2 = X1 -X3
a3−x3+x4=M>>x4=x3−a1−a2−a3−3∗M=x1−C3
······
an−xn+x1=M>>xn=x1−C(n−1)
答案是所有xi的绝对值最小〉 - 创建时间:2019.7.11
#include <iostream>
#include<algorithm>
using namespace std;
int main(){
int n, aver, k, sum = 0;
cout << "请输入有多少人:";
cin >> n;
int* gold = new int[n + 1];
cout << "请输入每个人的金币数:";
for (int i = 0; i < n; i++){
cin >> gold[i];
sum += gold[i];
}
aver = sum / n;
gold[n - 1] = 0;
for (int i = n - 1; i >= 0; i--)
gold[i - 1] = gold[i] + aver - gold[i - 1];
sort(gold , gold + n);
k = n / 2;
sum = 0;
for (int i = 0; i < n; i++)
sum = sum + abs(gold[i] - gold[k]);
cout << "最少需要金币:" << sum;
}