题目链接
https://www.lydsy.com/JudgeOnline/problem.php?id=1045
分析
环形的传递纸牌,将操作步数转化为 ∑ i = 1 n S [ i ] \sum_{i = 1}^n S[i] ∑i=1nS[i] 后进行数学推导可变成中位数相关问题,其中 S [ i ] = ∑ i = 1 n ( A [ i ] − S u m N ) S[i] = \sum_{i = 1}^n (A[i] - {Sum \over N}) S[i]=∑i=1n(A[i]−NSum)。
AC代码
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
inline int read() {
int num = 0;
char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9')
num = num * 10 + c - '0', c = getchar();
return num;
}
const int maxn = 1e6 + 5;
ll a[maxn], sum, ans;
int main() {
int n = read();
for (int i = 1; i <= n; ++i) sum += a[i] = read();
for (int i = 1; i <= n; ++i) a[i] += a[i - 1] - sum / n;
sort(a + 1, a + n + 1);
for (int i = 1; i <= n; ++i) ans += abs(a[i] - a[n / 2 + 1]);
printf("%lld", ans);
return 0;
}