SLOJ P1117. 糖果传递
题目描述
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为11。
输入格式
小朋友个数n,下面n行ai。
输出格式
求使所有人获得均等糖果的最小代价。
输入输出样例
输入 #14 1 2 5 4
输出 #1
4
说明/提示
对于100%的数据n≤106。
思路:贪心(标签上的东西不抄白不抄)好吧我一开始是没有想明白的,受别的dalao启发,A为每个小朋友的原有糖果数,ave是平均值,X为需要给前一个小朋友的数目,C为相邻两个小朋友糖果数量之差,于是可以得到n个Ai-Xi+Xi+1=ave。
不难想到,最后一个方程可以由前面所有方程联立导出,所以有用的方程有且仅有n-1个。
我们可以将所有方程中的X视为自变量,我们就只用求Xi-Ci的极值便可算出此题的解了。
我们这时候可以与几何联系起来,这个问题即可视为:数轴上给定一些点,找出一个到他们距离之和最小的点,即是本题之解。
其中,不难看出,中位数的距离是最小的,证明可以看这里
#include<bits/stdc++.h> using namespace std; int n,a[1500010]; long long c[2000010],sum; int main(){ scanf("%d",&n); for(int i = 1;i<=n;i++){ scanf("%d",&a[i]); sum+=a[i]; } sum/=n; for(int i = 1;i<=n-1;i++) c[i] = c[i-1]+a[i]-sum; sort(c,c+n); int mid = (n-1)/2; long long ans = 0; for(int i = 0;i<=mid;++i) ans+=c[n-i-1]-c[i]; printf("%lld",ans); return 0; }
注意排序从零开排
综上所述,我是蒟蒻
补充个事,那个样例旁边的复制键是个假的(从洛谷复制题目时不知道怎么把这玩意带上了)
2022-10-26 17:14:55
标签:Xi,洛谷,int,P2512,传递,复制,小朋友,糖果,HAOI2008 From: https://www.cnblogs.com/cztq/p/16829000.html