Luogu2512/CH122/AcWing122糖果传递 模拟
Description
有n个小朋友坐成一圈,每人有ai个糖果.
每人只能给左右两人传递糖果.
每人每次传递一个糖果代价为1.
求使所有人获得均等糖果的最小代价.
Sol
感觉超级似曾相识,大概是寒假做过的题目.
求出平均数x,然后ai−=x
设i小朋友给i+1小朋友bi个糖果,特别地,bn表示第n个小朋友给第1个小朋友的糖果.
bn+a1−b1=0 ⇔ b1=a1+bn=s1+bn
b1+a2−b2=0 ⇔ b2=a2+b1=a1+a2+bn=s2+bn
答案为|b1|+|b2|+....+|bn|
即为|s1+bn|+|s2+bn|+....+|sn+bn|
就是−bn到s1,s2,....,sn的距离之和,要使之最小,−bn就为s1,s2,....,sn的中位数.
over
Code
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define il inline #define Rg register #define go(i,a,b) for(Rg int i=a;i<=b;i++) #define yes(i,a,b) for(Rg int i=a;i>=b;i--) #define ll long long #define db double using namespace std; il int read() { int x=0,y=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();} while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();} return x*y; } const int N=1e6+1; int n,a[N]; ll as,s[N]; int main() { n=read(); go(i,1,n)a[i]=read(),s[n]+=a[i]; Rg int ave=s[n]/n,qwq; go(i,1,n)a[i]-=ave,s[i]=s[i-1]+a[i]; sort(s+1,s+n+1); qwq=-s[n/2+1];//qwq=-b[n] go(i,1,n)as+=abs(s[i]+qwq); printf("%lld\n",as); return 0; }
光伴随的阴影
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步