1 条题解

  • 0
    @ 2024-10-29 10:33:00

    解析:先以第1号小朋友为起点,算出每个小朋友需要向他后边的小朋友传递的糖果数量。

    考虑如果以第i+1号小朋友为起点,则传递数量为其他传递数量与第i号小朋友向后传递数量的差值。

    那么选传递数量的中位数,就可以得到最小传递数量。

    #include<bits/stdc++.h>
    using namespace std;
    int a[1000005];//a[i]表示第i个小朋友原有的糖果数量
    long long b[1000005];//b[i]表示从第i个小朋友传给第i+1个小朋友的数量
    long long sum=0;
    int n;
    long long ans=0;
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            sum+=a[i];
        }
        long long ave=sum/n;//平均数
        for(int i=1;i<=n;i++){//递推b[i]
            b[i]=(ave-a[i])+b[i-1];
        }
        sort(b+1,b+n+1);
        long long mid=b[(n+1)/2];//求中位数
        for(int i=1;i<=n;i++){
            ans+=abs(mid-b[i]);
        }
        cout<<ans;
        return 0;
    }
    • 1

    信息

    ID
    606
    时间
    1000ms
    内存
    512MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者