(y总做法笔记)(新手)
思路:
1.读题后绘制图形,最小代价即为|x1|+|x2|+|x3|+.....|xn|
2.再去寻找一些限制条件,可以发现等式方程组
a1-x1+x2=avg(均值)
a2-x2+x3=avg
......
an-xn+x1=avg
3.发现其实有多组解,并非全部为独立方程
所以应该每一个xk都能用某一个xi来表示
对不等式变形 发现最小代价转化为|x1-c1|+|x1-c2|+|x1-c3|+......+|x1-cn|
所以这道题目可以转化为配组+两两绝对值不等式
并且可以发现c数组存在关系 c[i]=c[i+1]+avg-a[i]
4.排序后求中值即可
细节:1.sort函数时间复杂度为nlog2n,所以不超限
2.c数组开到全局变量 c[n+1]=0,符合题意
3.如果从0到n-1,中间值为c[i/2]
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1000010;
int n;
typedef long long LL;
LL a[N],c[N];
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%lld",&a[i]);
LL sum=0;
for(int i=0;i<n;i++)sum+=a[i];
LL avg=sum/n;
for(int i=n-1;i>=0;i--)
{
c[i]=c[i+1]+avg-a[i];
}
sort(c,c+n);
LL res=0;
for(int i=0;i<n;i++)
{
res+=abs(c[i]-c[n/2]);
}
printf("%lld",res);
return 0;
}