牛客多校第四場G Maximum Mode(模擬)
阿新 • • 發佈:2019-02-19
題目大意:
給出一個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; }