题目
如题这样,一开始想着啪啦啪啦用map然后各种秀操作,放了两三天一直不敢动手,发给队友后:
然后就emmm
然后发现这题emm,是第二次打cf的场。。。= =那时候菜到这题看了看题解,然后就点开了之前的代码不到一秒,看了行数。。。
那好好想想,纸笔上来Orz…,然后就巴拉巴拉各种,发现诶,排序之后,越大的数字到越小的数字的操作次数会越来越大,然后palapala那就一个数组放数字个数,一个数组放操作数,然后就过了emmm…啊啊啊啊啊思维题,干嘛想成码力题。。。。
所以做题还是不能看题解啊啊啊啊Orz,然后CF大多数是思维题,所以瞎想想瞎画画估计就出了。。。
#include<algorithm>
#include<cstdio>
#include<queue>
#include<iostream>
#include<map>
using namespace std;
int a[2*100006];
int Opt[2*1000006];
int cnt[2*1000006];
int main()
{
int n,m;
cin>>n>>m;
int maxv=0;
for(int i=1;i<=n;i++){
int x;cin>>a[i];
}
sort(a+1,a+1+n);
int ans=0x3f3f3f3f;
for(int i=1;i<=n;i++){
int x=a[i];
int opt=0;
cnt[a[i]]++;
if(cnt[a[i]]>=m)ans=min(Opt[a[i]],ans);
while(x!=0){
opt++;
x/=2;
cnt[x]++;
Opt[x]+=opt;
if(cnt[x]>=m)ans=min(Opt[x],ans);
}
Opt[x]+=opt;
}
cout<<ans<<endl;
}