zoukankan      html  css  js  c++  java
  • # ACwing 122. 糖果传递(数学 + 贪心)

    题意

    在这里插入图片描述
    在这里插入图片描述

    思路

    假设(n=4),每个人的糖果数为(a_1,a_2,a_3,a_4)(A_i)表示第(i)个人给第(i+1)个人的糖果数(正表示给,负表示获得),那么可以表示成:

    (a_1 + A_4 - A_1 = ave \ a_2 + A_1 - A_2 = ave \ a_3 + A_2 - A_3 = ave \ a_4 + A_3 - A_4 = ave)

    (A_i)全部使用(A_4)表示:

    (A_1 = A_4 - (ave-a_1) \ A_2 = A_4 - (2 * ave-(a_1+a_2)) \ A_3 = A_4 - (3 * ave-(a_1 + a_2 + a_3) ) \ A_4 = A_4 - 0)

    题目要求的就是求(|A_1| + |A_2| + |A_3| + |A_4|)的最小值,那么就可以理解为((ave-a_1))(2*ave-(a_1+a_2))(3*ave - (a_1 + a_2 + a_3)) , 0为数轴上的四个点,在数轴上选择一个点(A_4)使得这个点到其他点的距离之和最小,这就是典型的中位数问题了。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+5;
    int a[maxn];
    int n;
    long long sum;
    int main(){
        cin>>n;
        sum=0;
    
        for(int i=1;i<=n;i++){
            cin>>a[i];
            sum+=a[i];
        }
        
        long long ave=sum/n;
        long long pre=0;
        
        for(int i=0;i<n;i++){
            pre+=a[i];
            a[i]=ave*i-pre;
        }
        
        sort(a,a+n);
        long long t=a[n/2];
        long long ans=0;
        for(int i=0;i<n;i++){
            ans+=abs(a[i]-t);
        }
        
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    正则表达式30分钟入门教程
    21 个HTML网页转RSS Feeds的工具
    批量去除PHP文件中bom的PHP代码
    WEB网页采集技术参考
    xcache
    Sonix SN9P701 OCR点读笔二维码识别源码
    UI设计素材资源网站推荐
    解决电信DNS劫持
    自学电子技术的最佳方法
    wp资源汇总
  • 原文地址:https://www.cnblogs.com/sstealer/p/13297826.html
Copyright © 2011-2022 走看看