Codeforces Equalizing by Division (hard version)

在这里插入图片描述
题目大意:
给你一个数组,给定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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章