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 }

 

 

你可能感兴趣的:(ZOJ)