BZOJ 1045 环形均分纸牌

环形均分纸牌,数学推导不是很难。

只给提示:设p[i]表示第i个人给第i+1个人的纸牌数,若p[i]<0表示,第i+1个人给第i个人的纸牌数

然后自己推吧~

 

View Code
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cstdio>
 5 #include <algorithm>
 6 #include <cmath>
 7 
 8 #define N 2000000
 9 
10 using namespace std;
11 
12 long long can[N],qz[N],c[N],s,sum,ans;
13 int n;
14 
15 inline void go()
16 {
17     scanf("%d",&n);
18     for(int i=1;i<=n;i++)
19     {
20         scanf("%lld",&can[i]);
21         sum+=can[i];
22     }
23     s=sum/n;
24     for(int i=2;i<=n;i++) c[i]=can[i-1]-s;
25     c[1]=0;
26     for(int i=2;i<=n;i++) c[i]+=c[i-1]; 
27     sort(c+1,c+1+n);
28     s=c[(n+1)>>1];
29     for(int i=1;i<=n;i++) ans+=abs(c[i]-s);
30     printf("%lld\n",ans);
31 }
32 
33 int main()
34 {
35     go();
36     return 0;
37 }

 

 

posted @ 2013-01-17 19:32  proverbs  阅读(1171)  评论(0编辑  收藏  举报