1. 程式人生 > >1065. 單身狗(25)-PAT乙級真題

1065. 單身狗(25)-PAT乙級真題

“單身狗”是中文對於單身人士的一種愛稱。本題請你從上萬人的大型派對中找出落單的客人,以便給予特殊關愛。

輸入格式:

輸入第一行給出一個正整數N(<=50000),是已知夫妻/伴侶的對數;隨後N行,每行給出一對夫妻/伴侶——為方便起見,每人對應一個ID號,為5位數字(從00000到99999),ID間以空格分隔;之後給出一個正整數M(<=10000),為參加派對的總人數;隨後一行給出這M位客人的ID,以空格分隔。題目保證無人重婚或腳踩兩條船。

輸出格式:

首先第一行輸出落單客人的總人數;隨後第二行按ID遞增順序列出落單的客人。ID間用1個空格分隔,行的首尾不得有多餘空格。

輸入樣例:

3
11111 22222
33333 44444
55555 66666
7
55555 44444 10000 88888 22222 11111 23333

輸出樣例:

5
10000 23333 44444 55555 88888

分析: 設立陣列couple[i] = j表示i的物件是j。一開始先設定為都是-1。設立陣列isExist表示某人的物件是否來到了派對上。接收資料的時候,對於每一對a和b,將couple的a設定為b,b設定為a,表示他倆是一對。對於每一個需要判斷的人,將其儲存在guest數組裡面,如果它不是單身的(也就是如果它的couple[guest[i]] != -1)那麼就將它物件的isExist設定為1,表示他物件的物件(也就是他自己)來到了派對。這樣所有isExist不為1的人,物件是沒有來到派對的。把所有的人遍歷後插入一個集合set裡面,set的size就是所求的人數,set裡面的所有數就是所求的人的遞增排列。

#include <iostream>
#include <vector>
#include <set>
using namespace std;
int main() {
    int n, a, b, m;
    scanf("%d", &n);
    vector<int> couple(100000, -1);
    for (int i = 0; i < n; i++) {
        scanf("%d%d", &a, &b);
        couple[a] = b;
        couple[b] = a;
    }
    scanf("%d", &m);
    vector<int> guest(m), isExist(100000);
    for (int i = 0; i < m; i++) {
        scanf("%d", &guest[i]);
        if (couple[guest[i]] != -1)
            isExist[couple[guest[i]]] = 1;
    }
    set<int> s;
    for (int i = 0; i < m; i++) {
        if (!isExist[guest[i]])
            s.insert(guest[i]);
    }
    printf("%d\n", s.size());
    for (auto it = s.begin(); it != s.end(); it++) {
        if (it != s.begin()) printf(" ");
        printf("%05d", *it);
    }
    return 0;
}