BZOJ P3293&&P1045
其实后面一道题很早就做了,发现P3293和P1045一样,把之前AC的交上去居然没过....
不过这题以前是看题解的,所以干脆重做了一遍
和均分纸牌很相似,所以先同样,只要减去平均数,考虑向前一个位置移X,最后全部是零就可以了
只考虑每个位置向前一个位置移牌的数量Xi,要求sigma(abs(xi))最小
设第一个位置向最后一个位置移牌X1,那么剩下的都可以依次推出
x1=x1,x2=x1-a[1],x3=x1-a[1]-a[2],x4=x1-a[1]-a[2]-a[3]....
显然是一个中位数贪心。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cstdlib> #include <cmath> using namespace std; const int N=500000; int n,a[N]; int main() { scanf("%d",&n); long long sum=0; for (int i=0;i<n;i++) scanf("%d",&a[i]),sum+=a[i]; sum=sum/n; for (int i=1;i<n;i++) a[i]=sum-a[i],a[i]+=a[i-1]; sort(a,a+n); long long ans=0,mid=a[n>>1]; for (int i=0;i<n;i++) ans=ans+abs(a[i]-mid); if (n==1) printf("0\n"); else printf("%lld\n",ans); return 0; }