BZOJ P3293&&P1045

其实后面一道题很早就做了,发现P3293和P1045一样,把之前AC的交上去居然没过....

不过这题以前是看题解的,所以干脆重做了一遍

和均分纸牌很相似,所以先同样,只要减去平均数,考虑向前一个位置移X,最后全部是零就可以了

只考虑每个位置向前一个位置移牌的数量Xi,要求sigma(abs(xi))最小

设第一个位置向最后一个位置移牌X1,那么剩下的都可以依次推出

x1=x1,x2=x1-a[1],x3=x1-a[1]-a[2],x4=x1-a[1]-a[2]-a[3]....

显然是一个中位数贪心。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=500000;
int n,a[N];     
int main()
  {  scanf("%d",&n); long long sum=0;  
     for (int i=0;i<n;i++) 
     scanf("%d",&a[i]),sum+=a[i]; sum=sum/n;  
     for (int i=1;i<n;i++) a[i]=sum-a[i],a[i]+=a[i-1];
     sort(a,a+n); long long ans=0,mid=a[n>>1];  
     for (int i=0;i<n;i++) 
     ans=ans+abs(a[i]-mid); 
     if (n==1) printf("0\n");
     else    printf("%lld\n",ans);     
     return 0;    
     } 
View Code

 

posted @ 2014-04-29 16:03  william's blog  阅读(245)  评论(0编辑  收藏  举报

adopt your own virtual pet!