(原)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 }

 

posted @ 2018-07-29 14:16  HHHyacinth  阅读(186)  评论(0编辑  收藏  举报