题意:
有 n n n堆纸牌,第 i i i堆纸牌有 A i A_i Ai张。一次操作中,第一堆只可以给第二堆任意张,第 n n n堆只可以给第 n − 1 n-1 n−1堆任意张,其他堆 i i i,可以给第 i − 1 i-1 i−1或者 i + 1 i+1 i+1堆任意张。问最少的操作次数使每堆纸牌数量都相同。
思路:
第一堆只能由第二堆给出或得到,使第一堆等于平均值
a
v
e
ave
ave。
我们可以假设第一堆不等于
a
v
e
ave
ave,那么第二堆要通过一次操作使第一堆等于平均值。
操作之后
A
2
A_2
A2可能是正值,也可能是负值。在这里负值只是一个概念,可以理解为
A
3
A_3
A3要给
A
2
a
v
e
−
A
2
A_2~~ave-A_2
A2 ave−A2张牌,由此递推下去总能找到使负数变成正数的一堆纸牌。
简单来说就是,先解决第一堆,使第一堆变成
a
v
e
ave
ave然后再,把第二堆当成第一堆重复
决策(如果等于
a
v
e
ave
ave就跳过,不然就通过一次操作使它变成
a
v
e
ave
ave)
C o d e Code Code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int s[110];
int main() {
int n, sum = 0, ans = 0;
cin >> n;
for(int i=1; i<=n; i++) cin >> s[i], sum += s[i];
sum /= n; //ave
for(int i=1; i<=n; i++) {
if(s[i] - sum) s[i+1] += (s[i] - sum), ans++;//决策
}
cout << ans;
return 0;
}