1065 单身狗

陌陌的pat乙级题解目录

题解

使用一个数组记录两个人之间的情侣关系,即:a[x] = y, a[y] = x;
判断的时候,将先进来的人 x 和 x 的情侣y做标记,即:b[x] = b[a[x]] = 1;
如果之后的数进来, 若b[x] == 1 说明他的对象之前已经进来了
所以他们两个在这个判断一定不是单身狗,标记为 b[x] = b[a[x]] = 2
排队全部的人都由set接受,最后遍历set判断,利用set的自动排序功能

Code

#include <iostream>
#include <set>
#include <map>
#include <vector>
using namespace std;
int main()
{

    int N;
    cin >> N;
    int x, y;
    // 记录双方是情侣关系
    int a[100000] = {0};
    // 判断用,标记数组
    int b[100000] = {0};
    while (N--)
    {
        cin >> x >> y;
        a[x] = y;
        a[y] = x;
    }
    cin >> N;
    // 将参加派对的全部人加入
    set<int> v;
    int cnt = 0;
    int n = N;
    while (N--)
    {
        /* *************
         * 
         *  进来一个人x,直接把x和x的情侣标记
         *  如果 后面会有x的情路进来,那么说明x和x的情侣都来参加了排队
         *  所以 x和x的情侣就不是排队的单身汪 再次标记为2
         * 
         * **********/
        cin >> x;
        if (b[x] == 1)
        {
            b[x] = b[a[x]] = 2;
            cnt += 2;
        }
        else
        {

            b[x] = 1;
            b[a[x]] = 1;
        }
        v.insert(x);
    }


    cout << n - cnt << endl;

    int f = 0;
    for (auto &e : v)
    {
        if (b[e] == 1)
        {
            if (f++ != 0)
                cout << " ";
            printf("%05d", e);
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值