算法题(校庆)

105 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

校庆

题目描述

2019 年浙江大学将要庆祝成立 122122 周年。

为了准备校庆,校友会收集了所有校友的身份证号。

现在需要请你编写程序,根据来参加校庆的所有人士的身份证号,统计来了多少校友。

输入格式

输入在第一行给出正整数 NN。

随后 NN 行,每行给出一位校友的身份证号(1818 位由数字和大写字母 XX 组成的字符串)。题目保证身份证号不重复。

随后给出前来参加校庆的所有人士的信息:

首先是一个正整数 MM。

随后 MM 行,每行给出一位人士的身份证号。题目保证身份证号不重复。

输出格式

首先在第一行输出参加校庆的校友的人数。

然后在第二行输出最年长的校友的身份证号 —— 注意身份证第 7−147−14 位给出的是 yyyymmdd 格式的生日。

如果没有校友来,则在第二行输出最年长的来宾的身份证号。题目保证这样的校友或来宾必是唯一的。

数据范围

1≤N,M≤1051≤N,M≤105

输入样例:

5
372928196906118710
610481197806202213
440684198612150417
13072819571002001X
150702193604190912
6
530125197901260019
150702193604190912
220221196701020034
610481197806202213
440684198612150417
370205198709275042

输出样例:

3
150702193604190912

代码

#include <iostream>
#include <unordered_set> // unordered_set的头文件

using namespace std;

int n, m;
unordered_set<string> a, b, t; // a: 所有校友, b: 参加校庆的所有人士, t: 要从里面找答案的集合(为了节省码长)
string id;

int main()
{
    ios::sync_with_stdio(0); // 提高输入输出速度
    cin.tie(0); // 这个也是

    cin >> n;
    while (n -- ) // 输入所有校友的身份证号
    {
        cin >> id;
        a.insert(id);
    }

    cin >> m;
    while (m -- ) // 输入参加校庆的所有人士的身份证号
    {
        cin >> id;
        b.insert(id);
    }

    int cnt = 0; // cnt: 多少校友来了
    for (auto e : b) // 遍历b
        cnt += a.count(e); 

    cout << cnt << '\n'; // 输出

    if (!cnt) t = b; // 如果没有校友来,就在参加校庆的所有人士里面找答案
    else t = a; // 否则在校友里面找

    string maxbirth = "99999999", maxid; // maxbirth: 最年长的人的生日, maxid: 最年长的人的身份证号
    for (auto e : t) // 遍历t
    {
        if (!b.count(e)) continue; // 如果没有参加校庆就跳过
        string birth = e.substr(6, 8); // 提取生日
        if (birth < maxbirth) maxbirth = birth, maxid = e; // 更新答案
    }
    cout << maxid; // 输出

    return 0;
}