簡単とハードバージョン間の唯一の違いは、アレイ内の要素の数です。
あなたは配列を指定されている 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; }