PAT (Basic Level) Practice 1065 单身狗

题目:从上万人的大型派对中找出落单的客人,以便给予特殊关爱。

输入格式:

第一行:正整数N(已知伴侣的对数)。

随后N行:每行给出一对伴侣。每人对应一个 ID 号,为 5 位数字(从 00000 到 99999)。

第N+2行:正整数M(参加派对的总人数)。

第N+3行:M 位客人的 ID,以空格分隔。

注意:题目保证无人重婚或脚踩两条船

输出格式:

第一行输出落单客人的总人数。

第二行按 ID 递增顺序列出落单的客人。 

思路:根据题目可知,单身狗是指哪些没有伴侣有伴侣但伴侣没来的人。所以为了判断一个人是否有伴侣和伴侣是否来了,可以使用map来记录丈夫到妻子、妻子到丈夫的映射。

代码:

 #include<iostream>
#include<string>
#include<map>
#include<vector>
using namespace std;
int main(){
    int n;cin >> n;
    map<string,string> mpFQ;
    map<string,string> mpQF;
    for(int i = 0 ; i < n ; i ++){
        string sf,sq;cin >> sf >> sq;
        mpFQ.insert(make_pair(sf,sq)); // 丈-妻
        mpQF.insert(make_pair(sq,sf)); // 妻-丈
    }
    int m;cin >> m;
    vector<string> v;
    map<string,int> mp; // 用于快速判断某人是否参加了派对
    for(int i = 0 ; i < m ; i ++){
        string s;cin >> s;
        v.push_back(s); // 记录参加派对的人
        mp.insert(make_pair(s,1));
    }
    vector<string> singleDog;
    for(int i = 0 ; i < m ; i ++){
        // 是丈夫且妻子来了
        bool isZh = mpFQ.find(v[i]) != mpFQ.end() && mp.find(mpFQ[v[i]]) != mp.end();
        // 是妻子且丈夫来了
        bool isQi = mpQF.find(v[i]) != mpQF.end() && mp.find(mpQF[v[i]]) != mp.end();
        if(isZh || isQi){
            // 在聚会上不是单身狗:伴侣一起来了
            continue;
        }else{
            // 是聚会上的单身狗:没有伴侣或伴侣没来
            singleDog.push_back(v[i]);
        }
    }
    // 按题目要求输出
    int len = singleDog.size();
    sort(singleDog.begin(),singleDog.end());
    cout << len << endl;
    for(int i = 0 ; i < len ; i ++){
        cout << singleDog[i];
        if(i != len-1)
            cout << " ";
        else
            cout << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值