Problem: 2057B - Gorilla and the Exam
Language: c++17 

Solution 1 (runtime: 140 ms):
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

// #define int long long
// #define f(i, a, b) for (ll i = a; i < b; i++)
// #define fr(i, b, a) for (ll i = b; i >= a; i--)
// #define pb push_back
// #define fi first
// #define se second
// #define pii pair<ll, ll>
// #define vb vector<bool>
// #define vi vector<ll>
// #define vs vector<string>
// #define vvi vector<vector<ll>>
// #define vvb vector<vector<bool>>
// #define mii map<ll, ll>
// #define vpi vector<pair<ll, ll>>
// #define vvpi vector<vector<pair<ll, ll>>>
// #define inf 8e18
// #define sortv(v) sort(v.begin(), v.end())
 



// Efficient GCD
ll gcd(ll a, ll b) {
    return b == 0 ? a : gcd(b, a % b);
}

// Efficient LCM
ll lcm(ll a, ll b) {
    return a / gcd(a, b) * b;
}
// bool isPrime(int n) {
//     // Prime numbers are greater than 1
//     if (n <= 1) return false;
    
//     // 2 and 3 are prime
//     if (n <= 3) return true;

//     // Eliminate multiples of 2 and 3
//     if (n % 2 == 0 || n % 3 == 0) return false;

//     // Check for factors up to sqrt(n)
//     for (int i = 5; i * i <= n; i += 6) {
//         if (n % i == 0 || n % (i + 2) == 0)
//             return false;
//     }

//     return true;
// }
// ll f(ll n)
// {
//     if(n%2==0) return 2;
//     for(ll i=3;i*i<=n;i+=2)
//     {
//         if(n%i==0) return i;
//     }
//     return n;
// }
// ll calculateDivisors(long long n) {
//     int divisors = 1;

//     // Count the power of 2
//     int count = 0;
//     while (n % 2 == 0) {
//         n /= 2;
//         count++;
//     }
//     divisors *= (count + 1);

//     // Check for odd prime factors
//     for (long long i = 3; i * i <= n; i += 2) {
//         count = 0;
//         while (n % i == 0) {
//             n /= i;
//             count++;
//         }
//         divisors *= (count + 1);
//     }

//     // If n is still greater than 1, it must be a prime number
//     if (n > 1) {
//         divisors *= 2; // Prime factor contributes (1 + 1)
//     }

//     return divisors;
// }


int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int t;
    cin >> t;
    while (t--) {
        ll n,k;
        cin >> n>>k;
        vector<ll> v(n);
        for(ll i=0;i<n;i++){
            cin>>v[i];
        }
        map<ll,ll> mp;
        for(int x:v){
            mp[x]++;
        }
        vector<pair<ll,ll>> v1;
        for(auto it:mp){
            v1.push_back({it.second,it.first});
        }
        sort(v1.begin(),v1.end());

        ll i=0;
        //cout<<v1.size()<<'\n';
        while(i<v1.size()){
            if(k>=v1[i].first){
                k-=v1[i].first;
            }
            else break;
            i++;
        }
        if(i>=v1.size()-1) cout<<1<<'\n';
        else cout<<v1.size()-i<<'\n';
        
       
        
        
    }

    return 0;
}


Solution 2 (runtime: 218 ms):
#include<bits/stdc++.h>
#define ll long long
#define pi pair<int,int>
using namespace std;
static bool Cmp(pair<ll,ll>&a,pair<ll,ll>&b){
    return a.second<b.second;
}
int main(){
    int t;
    cin>>t;
    while(t--){
       ll n,k;
       cin>>n>>k;
       vector<ll>a(n);
       map<ll,ll>mp;
       for(auto &i:a){
           cin>>i;
           mp[i]++;
       }
       
     
        vector<pair<ll,ll>>v(mp.begin(),mp.end());
        sort(v.begin(),v.end(),Cmp);
        
        
        ll size=v.size();
        ll cnt=0;
        for(int i=0;i<size-1 && k>0;i++){
            if(v[i].second<=k){
                k=k-v[i].second;
                cnt++;
            }
            else{
                break;
            }
        }
        
           cout<<size-cnt<<endl;
        }
           
        
    return 0;
}