题目大意:
给你一个数组,给定k,定义一个操作为arr[i]/2,问你至少操作多少次,使数组中存在k个相等的数
解题思路:
首先我们要排一下序,从小到大排,然后对每个,枚举每个元素,枚举的同时除二,同时用一个数组cnt记录在除二的过程的出现的数字,并记录一下,在用一个数组num记录arr[i]变成当前状态需要几步。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=2e5+10;
int n,k,ans=0x3f3f3f3f;
int cnt[maxn],nums[maxn],arr[maxn];
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i)
scanf("%d",&arr[i]);
sort(arr+1,arr+1+n);
for(int i=1;i<=n;++i)
{
int x=arr[i],temp=0;
while(x)
{
cnt[x]++;
nums[x]+=temp;
if(cnt[x]==k) ans=min(ans,nums[x]);
temp++;
x/=2;
}
}
printf("%d",ans);
return 0;
}