1. 程式人生 > >1045: [HAOI2008] 糖果傳遞

1045: [HAOI2008] 糖果傳遞

https 糖果 平均數 tps name tput http esp mem

Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 4897 Solved: 2457
[Submit][Status][Discuss]

Description

有n個小朋友坐成一圈,每人有ai個糖果。每人只能給左右兩人傳遞糖果。每人每次傳遞一個糖果代價為1。

Input

第一行一個正整數nn<=1‘000‘000,表示小朋友的個數. 接下來n行,每行一個整數ai,表示第i個小朋友得到的糖果的顆數.

Output

求使所有人獲得均等糖果的最小代價。

Sample Input

4
1
2
5
4

Sample Output

4 畢業被班上委托制作學校錄取分布地圖。。。沒錢拿(?_?),我的時間可是10美刀/小時 和均分紙牌類似,以絕對值差為貪心原則 設每位小朋友有Ai顆糖,若Xi>0表示第i位小朋友向第i-1位小朋友傳遞Xi顆糖,若Xi<0表示第i-1位小朋友向第i位小朋友傳遞Xi顆糖 最終每位小朋友持有ave=(A1+A2...+An)/n顆糖 則: A1-X1+X2=ave——>X2=X1-(A1-ave)=X1-C1——>C1=A1-ave A2-X2+X3=ave——>X3=X2-(A2-ave)=X1-C2——>C2=C1+A2-ave
A3-X3+X4=ave——>X4=X3-(A3-ave)=X1-C3——>C3=C2+A3-ave ...... An-Xn+X1=ave——>Xn=Xn-1-(An-ave)=X1-Cn——>Cn=Cn-1+An-ave
於是ans=|X1-C1|+|X2-C2|+|X3-C3|+...+|Xn-Cn| 為了使ans最小,Xi應該最接近Ci的平均數
 1 #include<iostream>
 2 #include<cstdio>
 3
#include<cmath> 4 #include<algorithm> 5 using namespace std; 6 7 #define LL long long 8 9 const int MAXN=1000005; 10 11 LL n,mid,ave,ans; 12 LL A[MAXN],C[MAXN]; 13 14 int main() 15 { 16 cin>>n; 17 for(int i=1;i<=n;i++) 18 { 19 cin>>A[i]; 20 ave+=A[i]; 21 } 22 ave/=n; 23 for(int i=2;i<=n;i++) 24 C[i]=C[i-1]+A[i]-ave; 25 sort(C+1,C+n+1); 26 mid=C[n/2+1]; 27 for(int i=1;i<=n;i++) 28 ans+=abs(C[i]-mid); 29 cout<<ans<<endl; 30 return 0; 31 }

1045: [HAOI2008] 糖果傳遞