选m个数使得这些数仅且只有一个众数,并且众数尽可能的大

#include<bits/stdc++.h>
using namespace std;
const int maxn=200000;
int a[maxn];
map<int,int>mapp;
struct node
{
    int x,y;
}b[maxn*2];
int cmp(node aa,node bb)
{
    if(aa.x==bb.x)
        return aa.y>bb.y;
    return aa.x>bb.x;
}
int main ()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m;
        mapp.clear();
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            mapp[a[i]]++;
        }
        int l=-1;
        for(auto it=mapp.begin();it!=mapp.end();it++)
        {
            b[++l].x=it->first;
            b[l].y=it->second;
        }
        sort(b,b+l+1,cmp);
        int sum=n-m;
        int flag=0;
        for(int i=0;i<=l;i++)
        {
            int answer=sum-b[i].y;
           // printf("%d\n",answer);
            if(answer<=0)
            {
                flag=b[i].x;
                break;
            }
            for(int j=0;j<=l;j++)
            {
                if(j==i)
                    continue;
                answer-=min(b[j].y,b[i].y-1);
                if(answer<=0)
                {
                    flag=b[i].x;
                    break;
                }
            }
            if(flag)
                break;
        }
        if(flag)
            printf("%d\n",flag);
        else
            printf("-1\n");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36616023/article/details/81270156