(原)2018牛课多校第4场--G
1 /* 2 3 按值从大到小排序,记录下相应出现的次数并去重 4 枚举:从大到小枚举,如果能够通过删除其他数让当前这个数成为众数,则循环结束,输出此数,如果循环结束也没答案,输出-1 5 优先级:值优先 6 7 举例: 8 5 0 9 3 3 3 5 5 10 众数为3,且唯一,输出3 11 5 1 12 3 3 3 5 5 13 如果删除3,则3和5都出现两次,众数不唯一,如果删除5,众数为3,故当删除5时可以找到答案为3,故输出3 14 5 2 15 3 3 3 5 5 16 删除两个3后,众数为5,如果删除两个5,众数为3,但5>3,故要第一个操作,输出5 17 18 */ 19 #include<iostream> 20 #include<cstdio> 21 #include<map> 22 #include<algorithm> 23 using namespace std; 24 const int maxn=1e5+1; 25 26 //a[] : 存储输入时的原数据 27 //v[] : a[]去重后保存在v[]中 28 //mymap : 用于记录某value出现的次数 29 int a[maxn]; 30 int v[maxn]; 31 map<int ,int >mymap; 32 33 bool cmp(int a,int b) 34 { 35 return a>b; 36 } 37 38 int main() 39 { 40 int T; 41 scanf("%d",&T); 42 while(T--) 43 { 44 mymap.clear(); 45 int n,m; 46 scanf("%d%d",&n,&m); 47 for(int i=1;i<=n;i++) 48 scanf("%d",a+i); 49 50 //按值从大到小排序 51 sort(a+1,a+n+1,cmp); 52 53 //去重操作,并在map中记录下value对应的次数 54 int index=0; 55 for(int i=1;i<=n;i++) 56 { 57 if(i == 1) 58 v[++index]=a[i]; 59 else if(a[i] != v[index]) 60 v[++index]=a[i]; 61 if(!mymap.count(a[i])) 62 mymap[a[i]]=0; 63 mymap[a[i]]++; 64 } 65 66 //从最大值开始枚举 67 int res=-1; 68 for(int i=1;i<=index;i++) 69 { 70 int s=0; 71 for(int j=1;j<=index;j++) 72 { 73 if(i != j && mymap[v[j]] >= mymap[v[i]]) 74 s += mymap[v[j]]-mymap[v[i]]+1; 75 } 76 //如果 s <= m 77 //说明可以通过删除其他数使当前数成为众数,且值最大 78 //跳出循环 79 if(s <= m) 80 { 81 res=v[i]; 82 break; 83 } 84 } 85 printf("%d\n",res); 86 } 87 return 0; 88 }
dalao代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 map<int,int> mp; 4 vector<pair<int,int> > v; 5 int n, m; 6 int cmp(pair<int,int> a,pair<int,int> b) 7 { 8 if(a.first != b.first) 9 return a.first > b.first; 10 else 11 return a.second > b.second; 12 } 13 14 int main() 15 { 16 ios::sync_with_stdio(false); 17 cin.tie(0); 18 cout.tie(0); 19 20 int t; 21 cin >> t; 22 while(t --) 23 { 24 mp.clear(); 25 v.clear(); 26 cin >> n >>m; 27 int k; 28 for(int i = 1;i <= n;i ++) 29 { 30 cin >> k; 31 mp[k] ++; 32 } 33 34 for(map<int,int>:: iterator it = mp.begin();it != mp.end();it ++) 35 { 36 pair<int,int> p(it->first,it->second); 37 v.push_back(p); 38 } 39 sort(v.begin(),v.end(),cmp); 40 41 //pair fir表示数字 sec表示个数 42 int res = -1; 43 for(int i = 0;i < v.size();i ++) 44 { 45 int s = 0, t = v[i].first; 46 for(int j = 0;j < v.size();j ++) 47 { 48 if(j == i) continue; 49 else if(j < i && v[j].second >= v[i].second) s += v[j].second - v[i].second + 1; 50 else 51 { 52 if(v[j].second > v[i].second) s += v[j].second - v[i].second + 1; 53 else if(v[j].second == v[i].second) s ++; 54 } 55 } 56 if(s <= m) 57 { 58 res = t; 59 break; 60 } 61 } 62 cout << res << endl; 63 } 64 return 0; 65 }