BZOJ1045 [HAOI2008] 糖果传递

Description

  有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。

Input

  第一行一个正整数n<=987654321,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的
糖果的颗数.

Output

  求使所有人获得均等糖果的最小代价。

Sample Input

4
1
2
5
4

Sample Output

4
 
 
正解:数学推导
解题报告:
  参考神犇博客:http://blog.csdn.net/Le_ballon_rouge/article/details/47783293
  不啰嗦了,取一个中位数就可以了。结论题
 
 //It is made by jump~
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#ifdef WIN32
#define OT "%I64d"
#else
#define OT "%lld"
#endif
using namespace std;
typedef long long LL;
const int MAXN = ;
int a[MAXN],c[MAXN],n;
LL ans,sum,ave; inline int getint()
{
int w=,q=;
char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar();
if (c=='-') q=, c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar();
return q ? -w : w;
} inline void work(){
n=getint(); for(int i=;i<=n;i++) a[i]=getint(),sum+=a[i];
ave=sum/n;
for(int i=;i<=n;i++) c[i]=c[i-]+ave-a[i]; sort(c+,c+n+);
int mid=c[n/+];//取中位数
for(int i=;i<=n;i++) ans+=abs(mid-c[i]);
printf(OT,ans);
} int main()
{
work();
return ;
}
上一篇:Mysql彻底卸载


下一篇:MYSQL 优化建议