1328F. Make k Equal


\(1328F. Make k Equal\)

Codeforces Round #629 (Div.3)

題意

給一個長度為 \(N\) 數組,每次可以進行兩種操作的任何一個,

  1. 選擇最大值 -1
  2. 選擇最小值 +1

詢問,如果到達 \(k\) 個相同的需要多少次操作。

題解

這個題無非就是對每個位置計算一下,到達它的最小值,求所有位置的最小值。

\(\left\{\begin{matrix} i*a_i - \sum_{1}^{i} a_i +(i-k)& i\geq 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+K\leq N+1\\ \end{matrix}\right.\)

此后求一下數組 \(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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM