[HAOI2008]糖果傳遞(貪心+公式推導)
阿新 • • 發佈:2021-07-25
這道題其實相當於 均分紙牌 的一個進階。
在均分紙牌中我們是這樣做的:讓每一堆都往左傳。
讓每個人的數量都減去平均數,結果可以經過簡單的數學推導得
其中S[i]是新陣列的字首和。這是均分紙牌問題的通用公式。
然後這道題,我們可以沿用這樣的思想進行數學推導
中位數證明(來自洛谷題解):
#include<bits/stdc++.h> #define N 1000003 #define LL long long using namespace std; LL a[N],c[N]; int main() { int n; scanf("%d",&n); LL sumView Code=0; 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]+=a[i]; c[i]+=c[i-1]; c[i]-=ave; } sort(c+1,c+1+n); LL mid=c[(n+1)/2];//mid即x1 LL ans=0; for(int i=1;i<=n;++i) ans+=abs(mid-c[i]); printf("%lld\n",ans); }