bzoj1045
这是一道七年级数学题你敢信??
不过用的的确是七上学的“数轴”来解。。。
首先先求出最后每个人手上的金币数p(这是可知的),
接着我们列一个玄学方程:a[i]表示第i个人初始的金币数量(确定),b[i]表示第i个人给第i+1个人的金币数(不确定)
a[i]-b[i]+b[i-1]=p,这样就能够确定关系了;
然后列出ans=∑|b[i]|,再把前面列出的n个方程相加,转化后发现要求的是:
给定数轴上的n个点,找出一个到他们的距离之和尽量小的点
然后利用七年级上的数学知识(好像我也就这水平),求得中位数的点最小,最后进行计算:
#include<bits/stdc++.h> using namespace std; long long p,n,c[1000010],a[1000010],e[1000010],ans; int main(){ scanf("%lld",&n); for(int i=1;i<=n;i++)scanf("%lld",&a[i]),p+=a[i]; a[0]=a[n]; p/=n; for(int i=1;i<=n;i++)c[i]=c[i-1]+a[i]-p; stable_sort(c+1,c+n+1); int t=-c[(n>>1)+1]; for(int i=1;i<=n;i++)ans+=abs(c[i]+t); printf("%lld",ans); return 0; }