1. 程式人生 > >牛客多校第四場G Maximum Mode(模擬)

牛客多校第四場G Maximum Mode(模擬)

題目大意:

給出一個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;
}