牛客多校第四场G Maximum Mode(模拟)

题目链接:https://www.nowcoder.com/acm/contest/142/G

题目大意:

给出一个n个数的序列,我们可以删除m个数,然后我们要求出现次数最多并且最大的,

也就是如果出现次数最多的有多个,那就必须删除其他的数,避免出现次数最大的有多个,然后我们要求值最大,所以我们还要尽量判断值大的 

题目思路:

首先我们先明确我们要取什么数:1.次数最多并且值最大的;2.且最大值唯一,要把不能有多个次数相同

既然我们要取次数最多并且值最大的,如果我们取当前这个数的话,我们肯定出现次数相同还有重复的话,我们优先肯定是取最大的,但是我们又要把所有次数比他多的删掉,因为取这个数就代表当前这个数的出现次数最多,但是我们不知道哪些比它多,我们直接遍历的话会超限,所以我们贪心,先用map记录下每个数出现的次数,然后我们用迭代器遍历,按次数最多的排前,然后次数相等的把大的排后面(因为我们是按次数从大到小排的,所以我们要把前面那些次数比当前位置多的都减成比他小,但是相同次数的时候我们取值大的,所以次数相等的时候按值的升序排)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100000+100;
struct node
{
    ll id,num;
}b[maxn];
ll n,m;
map<ll,ll>mp;
ll a[maxn];
int cnt;
bool cmp(node q,node w)
{
    if(q.num==w.num)return q.id<w.id;
    return q.num>w.num;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld%lld",&n,&m);
        mp.clear();
        for(int i=0;i<n;i++)
        {
            scanf("%lld",&a[i]);
            mp[a[i]]++;
        }
        cnt=0;
        for(map<ll,ll>::iterator it=mp.begin();it!=mp.end();it++)
        {
            b[cnt].id=it->first;
            b[cnt++].num=it->second;
        }
        sort(b,b+cnt,cmp);
        ll sum=0;
        int flag=0;
        ll num;
        for(int i=0;i<cnt;i++)
        {
            if(i<cnt-1&&b[i].num==b[i+1].num)
            {

                sum+=b[i].num;
                continue;
            }
            else
            {
                if(flag==0)
                {
                    if(sum-i*(b[i].num-1)<=m)
                    {
                        num=b[i].id;
                        flag=1;

                    }
                }
                else
                {
                    if(b[i].id>num)
                    {
                        if(sum-i*(b[i].num-1)<=m)
                        {
                            flag=1;
                            num=b[i].id;
                        }
                    }
                }
                sum+=b[i].num;
            }
        }
        if(!flag)printf("-1\n");
        else printf("%lld\n",num);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36782366/article/details/81543511