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

    挺有趣的。观察题目环形?切掉一个跑贪心?O(n^2)超时了。。。

    先计算m为每个最终糖果数量。

    设An传给A1了k个糖果,

    那么A1传给A2的糖果数为S1=k+A1-m,T1=A1-m

    那么A2传给A3的糖果数为S2=k+A1+A2-2*m ,T2=A1+A2-2*m

    那么A3传给A4的糖果数为S3=k+A1+A2+A3-3*m ,T3=A1+A2+A3-3*m

    ...

    那么An-1传给An的糖果数为Sn=k+A1+A2+A3+...+An-n*m ,Tn=A1+A2+A3+...+An-n*m

    我们最终目的是让我们最终目的是让S总和越小越好。

    看出来了什么,我们只需求出最适合的k值,那么k是什么S最小呢?

    k=T的中位数的相反数时最短!!!利用数轴想想,很容易。

    #include<bits/stdc++.h>
    const int N=1000005;
    typedef long long ll;
    int a[N];
    ll f[N];
    int main(){
        int n;
        ll m=0,ans=0;
        scanf("%d",&n);
        for(int i=1;i<=n;++i)scanf("%d",&a[i]),m+=a[i];
        m/=n;
        for(int i=1;i<=n;++i)f[i]=f[i-1]-m+a[i];
        std::sort(f+1,f+1+n);
        for(int i=1;i<=n;++i){
            ans+=abs(f[i]-f[(n+1)/2]);
        }
        printf("%lld",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    2021 0309-1 准备工作
    课程总结
    第十四周课程总结&实验报告
    第十三周课程总结
    第十二周课程总结
    第十一周课程总结
    第十周课程总结
    2019春总结作业
    第十二周作业
    第十一周作业
  • 原文地址:https://www.cnblogs.com/Dream-Runner/p/10131604.html
Copyright © 2011-2022 走看看