zoukankan      html  css  js  c++  java
  • (原)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
    ",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 }
  • 相关阅读:
    Python学习之旅(十二)
    Python学习之旅(十一)
    Python学习之旅(十)
    Python学习之旅(十)
    Python学习之旅(九)
    Python学习之旅(八)
    WPF 画刷应用
    WP8 学习 在APP.XAML中加入Resources
    WP8 学习 ApplicationBar 的创建 XAML代码
    WP8 学习 Onnavigatedto和OnnavigatedFrom的区别
  • 原文地址:https://www.cnblogs.com/violet-acmer/p/9385225.html
Copyright © 2011-2022 走看看