1065. 單身狗(25)-PAT乙級真題
阿新 • • 發佈:2018-12-29
“單身狗”是中文對於單身人士的一種愛稱。本題請你從上萬人的大型派對中找出落單的客人,以便給予特殊關愛。
輸入格式:
輸入第一行給出一個正整數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; }