P2512 [HAOI2008]糖果传递
题目描述
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
输入输出格式
输入格式:
小朋友个数n 下面n行 ai
输出格式:
求使所有人获得均等糖果的最小代价。
输入输出样例
输入样例#1:
4 1 2 5 4
输出样例#1:
4
说明
对于100%的数据 n<= 10^6
数学题……
hzwer大神の证明 ←讲的超详细的说qwq
于是求一波中位数就可以了
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #define ll long long using namespace std; const int N=1e6+9; int n,a[N]; ll sum,c[N],ans; int main() { scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&a[i]); sum+=a[i]; } ll ave=sum/n; for(int i=1;i<=n;++i) c[i]=c[i-1]-a[i]+ave; sort(c+1,c+n+1); int mid=c[n>>1]; for(int i=1;i<=n;++i)ans+=abs(c[i]-mid); cout<<ans<<endl; return 0; }
by:wypx