zoukankan      html  css  js  c++  java
  • 糖果传递

    有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。

    1号小朋友给了n号小朋友x1颗糖

    2号小朋友给了1号小朋友x2颗糖

    ……

    那么ans=|x1|+|x2|+|x3|……+|xn|

    设ai-average=ci;

    a1+x2-x1=average

    变形得

    x1-c1=x2;

    x2-c2=x3=>x1-c1-c2=x3

    ……

    x1-(c1+c2+……+cn)=x1;

    那么

    ans=|x1-c1|+|x1-(c1+c2)|+|x1-(c1+c2+c3)|+……|x1|

    这不就是个中位数水题吗

    看我一发A了它

    #include<bits/stdc++.h>
    #define re return
    #define ll long long 
    #define inc(i,l,r) for(int i=l;i<=r;++i)
    using namespace std;
    template<typename T>inline void rd(T&x)
    {
        char c;bool f=0;
        while((c=getchar())<'0'||c>'9')if(c=='-')f=1;
        x=c^48;
        while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);
        if(f)x=-x;
    } 
    
    ll n,T,a[1000005],b[1000005]; 
    
    
    int main()
    {
        freopen("in.txt","r",stdin);
        
        ll average=0;
        rd(n);
        inc(i,1,n)
        {
            rd(a[i]);
            average+=a[i];
        }
        
        average/=n;
        
        inc(i,1,n)
        b[i]=b[i-1]+a[i]-average;
        
        sort(b+1,b+n+1);
        
        ll mid=b[(n+1)>>1],ans=0;
        
        
        inc(i,1,(n+1)>>1)
        ans+=mid-b[i];
        
        inc(i,((n+1)>>1)+1,n)
        ans+=b[i]-mid;
        
        printf("%lld",ans);
        re 0;
    }
  • 相关阅读:
    Advanced Configuration Tricks
    Reviewing the Blog Module
    Editing and Deleting Data
    Making Use of Forms and Fieldsets
    Understanding the Router
    SQL Abstraction and Object Hydration
    Preparing for Different Databases
    Java学习理解路线图
    Openstack学习历程_1_视频
    CentOS安装Nginx负载
  • 原文地址:https://www.cnblogs.com/lsyyy/p/11437358.html
Copyright © 2011-2022 走看看