傳送門
https://pintia.cn/problem-sets/994805260223102976/problems/994805266942377984
題目
“單身狗”是中文對于單身人士的一種愛稱。本題請你從上萬人的大型派對中找出落單的客人,以便給予特殊關愛。
輸入格式:
輸入第一行給出一個正整數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
分析
真是一道惡趣味的題,不過作為最后一道,難度倒是不大。
1.建立一個伴侶表,用每個人ID作為索引,在其索引下,存放夫妻/伴侶的ID;
舉例來講,若11111和22222互為伴侶,則table[11111]=22222,table[22222]=11111。
2.先把所有參加排隊的賓客ID存到數組里面;
3.遍歷賓客數組,查找對應伴侶表里面的伴侶是否能在賓客的數組找到,如果找不到,說明是單身狗,將其加入到單身狗的數組里面;
4.遍歷賓客數組完成后,對單身狗數組排序(升序);
5.遍歷輸出單身狗數組。
注意:ID不足五位的,要用0補位,就這一個坑。
對了,還有,末尾不要輸出一個換行符,容易有錯。
強迫癥是病,得治。
源代碼
//C/C++實現
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int table[100000];
int main(){
int n;
scanf("%d", &n);
int a, b;
for(int i = 0; i < n; ++i){
scanf("%d %d", &a, &b);
//建立相互映射關系
table[a] = b;
table[b] = a;
}
scanf("%d", &n);
vector<int> v(n);
vector<int> doge;
for(int i = 0; i < n; ++i){
scanf("%d", &v[i]);
}
for(int i = 0; i < n; ++i){
vector<int>::iterator result = find(v.begin(), v.end(), table[v[i]]);
if(result == v.end()){ //說明沒找到他/她的伴侶
doge.push_back(v[i]); //單身狗的隊伍又壯大了
}
}
sort(doge.begin(),doge.end());
printf("%d\n", doge.size());
for(int i = 0; i < doge.size(); ++i){
if(i == 0){
printf("%05d", doge[i]);
}
else{
printf(" %05d", doge[i]);
}
}
// printf("\n");
}