BZOJ1045 [HAOI2008] 糖果传递
Description
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
Input
第一行一个正整数n<=987654321,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的
糖果的颗数.
Output
求使所有人获得均等糖果的最小代价。
Sample Input
4
1
2
5
4
1
2
5
4
Sample Output
4
正解:数学推导
解题报告:
参考神犇博客:http://blog.csdn.net/Le_ballon_rouge/article/details/47783293
不啰嗦了,取一个中位数就可以了。结论题
1 //It is made by jump~ 2 #include <iostream> 3 #include <cstdlib> 4 #include <cstring> 5 #include <cstdio> 6 #include <cmath> 7 #include <algorithm> 8 #include <ctime> 9 #include <vector> 10 #include <queue> 11 #include <map> 12 #include <set> 13 #ifdef WIN32 14 #define OT "%I64d" 15 #else 16 #define OT "%lld" 17 #endif 18 using namespace std; 19 typedef long long LL; 20 const int MAXN = 1000011; 21 int a[MAXN],c[MAXN],n; 22 LL ans,sum,ave; 23 24 inline int getint() 25 { 26 int w=0,q=0; 27 char c=getchar(); 28 while((c<'0' || c>'9') && c!='-') c=getchar(); 29 if (c=='-') q=1, c=getchar(); 30 while (c>='0' && c<='9') w=w*10+c-'0', c=getchar(); 31 return q ? -w : w; 32 } 33 34 inline void work(){ 35 n=getint(); for(int i=1;i<=n;i++) a[i]=getint(),sum+=a[i]; 36 ave=sum/n; 37 for(int i=2;i<=n;i++) c[i]=c[i-1]+ave-a[i]; sort(c+1,c+n+1); 38 int mid=c[n/2+1];//取中位数 39 for(int i=1;i<=n;i++) ans+=abs(mid-c[i]); 40 printf(OT,ans); 41 } 42 43 int main() 44 { 45 work(); 46 return 0; 47 }
本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!