Advertisement

上海计算机学会2024年7月月赛C++乙组T2选举快报

阅读量:

选举快报

内存限制: 256 Mb时间限制: 1000 ms

题目描述

在一场选举过程中,n 张选票依次打开,给定每张选票提名的候选者姓名,请统计在每打开一张选票后,谁是当下得票最高的候选者。

若两名候选者得票数量一样多,输出字典序排名靠前的候选者名字。

输入格式
  • 第一行:单个整数:表示 n
  • 第二行到第 n+1 行:第 i+1 行有一个字符串 sisi​ 表示第 ii 张选票提名的候选人,保证 si​ 只含英文字母。
输出格式

共 n 行:在第 i 行,输出第 i 张选票打开后,最领先的候选人姓名。

数据范围
  • 30% 的数据,1≤n≤100
  • 60% 的数据,1≤n≤50,000
  • 100% 的数据,1≤n≤300,000
样例数据

输入:
4
Tom
Jerry
Tom
Jerry
输出:
Tom
Jerry
Tom
Jerry

解析:暴力法,时间复杂度O(m^2),m为被选举人人数:

详见代码:

复制代码
 #include <bits/stdc++.h>

    
 using namespace std;
    
 struct node {
    
     string name;
    
     int num;
    
 };
    
 node a[300005];
    
 int n;
    
 int cnt = 0;//获得选票的候选人人数
    
 int mx = 0;//最多获得票数
    
 string name;//获得最多票数的候选人名字
    
 int main() {
    
     cin >> n;
    
     for(int i = 1; i <= n; i++) {
    
     string s;
    
     cin >> s;
    
     bool flag = 0;//假设是第一次获得选票
    
     for(int j = 1; j <= cnt; j++) {//枚举已经得票的被选举人
    
         if (a[j].name == s) {//找到
    
             a[j].num++;//票数加一
    
             flag = 1;//非第一次获得选票
    
         }
    
         //求最大值
    
         if (a[j].num > mx || a[j].num == mx && a[j].name < name) {
    
             mx = a[j].num;
    
             name = a[j].name;
    
         }
    
     }
    
     if (flag == 0) {//如果是第一次获得选票
    
         cnt++;
    
         a[cnt].name = s;
    
         a[cnt].num = 1;
    
     }
    
     //取最大值
    
     if (a[cnt].num > mx || a[cnt].num == mx && a[cnt].name < name) {
    
         mx = a[cnt].num;
    
         name = a[cnt].name;
    
     }
    
     cout << name << "\n";
    
     }
    
     return 0;
    
 }
    
    
    
    

使用map保存候选人,则可以将时间复杂度提升到O(MlogM),M为候选人人数,

详见代码:

复制代码
 #include <bits/stdc++.h>

    
 using namespace std;
    
 map <string, int> mp;
    
 int n;
    
 int mx = 0;//最多获得票数
    
 string name;//获得最多票数的候选人名字
    
 int main() {
    
     cin >> n;
    
     for(int i = 1; i <= n; i++) {
    
     string s;
    
     cin >> s;
    
     mp[s]++;
    
     if (mp[s] > mx || mp[s] == mx && s < name) {
    
         mx = mp[s];
    
         name = s;
    
     }
    
     cout << name << "\n";
    
     }
    
     return 0;
    
 }
    
    
    
    

全部评论 (0)

还没有任何评论哟~