課(簡単バージョン)(簡単バージョン)による除算(ハードバージョン)&& D1等しくすることによってD2イコライジング(Codeforcesラウンド#582(DIV。3))

簡単とハードバージョン間の唯一の違いは、アレイ内の要素の数です。

あなたは配列を指定されている  Aからなる  n個の n個の整数を。1つの動きでは、任意の選択することができます  A 私は愛をしててそれを割り  2(つまり、一手にあなたが設定することができます切り捨て2  I := I 2 AI:=⌊ai2⌋を)。

あなたは、このような操作を行うことが可能  と何度も(おそらく、ゼロ)の数  の任意  のA 私は愛。

あなたの仕事は、少なくとも取得するために必要な操作の可能な最小数を計算することである  k個のアレイ中のK同数。

有することが可能であることを忘れてはいけない  = 0、いくつかの操作の後、AI = 0、常に存在するので、答えを。

入力

入力の最初の行は二つの整数含ま  N nおよび  k個の K(1個のk個の≤のN 50配列内の要素の数と必要と同数の数- 1≤k≤n≤50を)。

入力の2行目は含ま  N nは整数  1 2 ... n個の A1、A2、...、(1 I 2 10 5 1≤ai≤2⋅105)、  I AIある  のi番目の要素  A。

出力

少なくとも得るために必要な操作の可能な最小数-オン整数印刷  k個のアレイ中のK同数。

入力
コピー
5 3 
1 2 2 4 5
出力
コピー
1
入力
コピー
5 3 
1 2 3 4 5
出力
コピー
2
入力
コピー
5 3 
1 2 3 3 3
出力
コピー
0

ベクターが使用されているネストされたマップ(推奨)も可能もちろん、二次元アレイ。
 

 
    

#include <ビット/ STDC ++ H>
名前空間STDを使用して、

#define TLEのstd ::イオス:: sync_with_stdio(偽); cin.tie(NULL); cout.tie(NULL);
#define(x)は一back(X)を加えます。
#define allint整数N、M、K = 0、T、L = 0、R = 0、CNT = 0、ANS = 0、POS = 0。
INT メイン()
{ 
    マップ < int型、ベクトル< INT >> MV。
    allint; TLE。
    CIN >> N >> K。
    以下のためにint型 i = 0 ; iがn <I ++の
    { 
        CIN >> Mと、
        POS = 0 ; //记录有多少个数>> 1之后等于M
         ながら(M) 
        {
            MV [M](POS)を.add ; // Mの現在の値を加えた後の数がmに等しいこの時間の後、POS / 2の倍数を有する
            POS ++ ; 
            M >> = 1 ; 
        } 
    } 
    ANS = 1E9 ;
     のための(MAP < INT、ベクトル< INT >> :: = mv.begin ITイテレータ(); ITをmv.end =();! IT ++ 
    { 
        ベクトル < INT > ARR;         
        ARR = IT-> SECOND;       
         IF( arr.size()<K)続け
        ソート(arr.begin()、arr.end()); 
        CNT = 0;
        以下のためにint型私= 0 ; I <K; iは++ 
            CNT + = ARR [I]。
        ANS = 分(ANS、CNT)。
    } 
    COUT << ANS << ENDL。
    OK; 
}

 




 
  

おすすめ

転載: www.cnblogs.com/Shallow-dream/p/11516066.html