• 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
  • 相关阅读:
    auto_ptr的VC版本源码剖析
    在VS2017中配置VLD(Visual Leak Detector)内存泄漏检测工具
    QT+VS中使用qDebug()打印调试信息无法显示
    QT+VS后中文字符乱码问题
    外观模式
    装饰模式(包装模式)
    组合模式
    桥接模式
    适配器模式
    单例模式
  • 原文地址:https://www.cnblogs.com/Dream-Runner/p/10131604.html
Copyright © 2020-2023  润新知