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

    (n) 个人围成一圈,第 (i) 个人有 (a_i) 个球,通过相互传递使得每个人球数均等,传递一人次代价为 (1),求最小代价。

    Solution

    (c_i = a_i - avg),即第 (i) 个人的输出量

    (x_i) 表示 (i) 一共向 (i-1) 传递的个数,那么由 (c_1=x_1-x_2 o x_2=x_1-c_1), (c_2=x_2-x_3=x_1-c_1-x_3 o x_3=x_1-c_1-c_2)

    (d_i=sum^{i-1} c_i+x_1),则我们要最小化 (sum_i |d_i-x_1|)

    求出 (d) 数列的中位数即可

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 1000005;
    
    int n,a[N],b[N],c[N],d[N];
    
    signed main() {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        int avg=0;
        for(int i=1;i<=n;i++) avg+=a[i];
        avg/=n;
        for(int i=1;i<=n;i++) c[i]=a[i]-avg;
        for(int i=1;i<=n;i++) d[i]=d[i-1]+c[i];
        sort(d,d+n);
        int mid=d[(n-1)/2];
        int ans=0;
        for(int i=0;i<n;i++) ans+=abs(mid-d[i]);
        cout<<ans<<endl;
    }
    
    
  • 相关阅读:
    Web框架本质及浅谈HTTP协议
    mysql
    jQuery
    Css
    html
    socket编程
    面向对象and类
    模块
    装饰器
    cef network-settings
  • 原文地址:https://www.cnblogs.com/mollnn/p/12389612.html
Copyright © 2011-2022 走看看