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 }
没有人能阻止我前进的步伐,除了我自己!