UVA-11300

来源:互联网 发布:ubuntu没有中文输入法 编辑:程序博客网 时间:2024/06/04 18:24

原题:UVA-11300


/*设Ai为每个人初始拥有的金币数量设xi为与左边的人交换金币的数量然后设金币总数为S,所以平均每人获得金币数量为M=S/nAi-xi+(x+1)i=M;A1-x1+x2=M;        x2=x1+M-A1A2-x2+x3=M;        x3=x2+M-A2=x1+M-A1+M-A2=x1+2M-A1-A2A3-x3+x4=M;        x4=x3+M-A3=x1+2M-A1-A2+M-A3=x1+3M-A1-A2-A3...An-xn+x(n+1)=M;    x(n+1)=xn+M-An要求x1+x2+x3+...+xn最小,即x1+(x1+M-A1)+(x1+2M-A1-A2)+(x1+3M-A1-A2-A3)+...最小可以运用中位数思想,即在数轴上找到一个点x1到达 0,-(M-A1),-(2M-A1-A2),-(3M-A1-A2-A3)...最小这个点就是中位数*/#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int a[1000002],c[1000002];int main() {    int n;    while(scanf("%d",&n)==1) {        long long sum=0;        for(int i=0; i<n; i++) {            scanf("%d",&a[i]);            sum+=a[i];        }        int ave=sum/n;        c[0]=0;        for(int i=1; i<n; i++)            c[i]=c[i-1]-ave+a[i];        sort(c,c+n);        long long mid=n/2,t=0,x=c[mid];        for(int i=0;i<n;i++)         t+=abs(x-c[i]);        printf("%lld\n",t);    }    return 0;}

0 0
原创粉丝点击