zoukankan      html  css  js  c++  java
  • 1328F. Make k Equal

    (1328F. Make k Equal)

    Codeforces Round #629 (Div.3)

    题意

    给一个长度为 (N) 数组,每次可以进行两种操作的任何一个,

    1. 选择最大值 -1
    2. 选择最小值 +1

    询问,如果到达 (k) 个相同的需要多少次操作。

    题解

    这个题无非就是对每个位置计算一下,到达它的最小值,求所有位置的最小值。

    (left{egin{matrix} i*a_i - sum_{1}^{i} a_i +(i-k)& igeq k \ (a_i*i-sum_{0}^{i}a_i)+sum_{i}^{N}-(N-i)*a_i-N+K \ sum_{i}^{N}a_i-(N-i+1)*a_i-(N-i+1)+K & i+Kleq N+1\ end{matrix} ight.)

    此后求一下数组 (a) 的前缀和,对每个进行优化,取最小值。

    AC Code

    #include <map>
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int MAXN = 2e5+5;
    typedef long long ll;
    ll a[MAXN],b[MAXN];
    int main(){
        int N,K,flag=0;
        map<ll,int>m;
        cin>>N>>K;
        for(int i=1;i<=N;++i){
            cin>>a[i];
            m[a[i]]++;
            if(m[a[i]]>=K)flag=1;
        }
        if(flag){
            cout<<0<<endl;
            return 0;
        }
        sort(a+1,a+1+N);
        for(int i=1;i<=N;++i)
            b[i]=b[i-1]+a[i];
        ll minn=1e16;
        for(int i=1;i<=N;++i){
            minn=min(minn,(a[i]*i-b[i])+(b[N]-b[i])-(N-i)*a[i]-N+K);
            if(i>=K)minn=min(minn,(a[i]*i-b[i])-i+K);
            if(i+K<=N+1)minn=min(minn,(b[N]-b[i-1])-(N-i+1)*a[i]-(N-i+1)+K);
        }
        cout<<minn<<endl;
        return 0;
    }
    
    新赛季的开始
  • 相关阅读:
    洛谷P3796
    cf1291c-Mind Control
    莫比乌斯函数
    C. Mixing Water(三分)
    E. Modular Stability(思维构造)
    【美团杯2020】平行四边形
    原根定义
    E. Are You Fired?(思维)
    102606C. Coronavirus Battle time limit per test4 seconds(三维拓扑序)
    E
  • 原文地址:https://www.cnblogs.com/VagrantAC/p/12579126.html
Copyright © 2011-2022 走看看