題目描述
單身狗
“單身狗”是中文對于單身人士的一種愛稱。本題請你從上萬人的大型派對中找出落單的客人,以便給予特殊關愛。
輸入格式:
輸入第一行給出一個正整數 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
解題思路
本題是一道經典的哈希表問題。我們可以利用字典來存儲每對夫妻/伴侶的關系,然后遍歷參加派對的客人,檢查他們是否有伴侶參加了派對。如果沒有,則說明這個人是落單客人,將他的ID加入到結果列表中。最后,按照ID遞增的順序輸出結果。
具體實現步驟如下:
- 讀取輸入,獲取已知夫妻/伴侶的對數
n
,已知夫妻/伴侶的ID號,參加派對的總人數m
以及參加派對的客人的ID號。 - 初始化一個字典
partners
以保存夫妻/伴侶的關系。 - 遍歷每對夫妻/伴侶,將其ID號與對方的ID號存儲在
partners
中。 - 初始化一個集合
guests
以保存參加派對的客人的ID號。 - 遍歷每位客人,檢查其是否有伴侶參加派對。如果沒有,則將其ID號添加到結果列表
lonely_guests
中。 - 如果有任何落單客人,則按升序排序并輸出他們的數量和ID號。
Python代碼實現
# 獲取配對數目
n = int(input())# 初始化字典以存儲配對關系
partners = {}# 將配對關系輸入字典
for i in range(n):temp1, temp2 = map(int, input().split())partners[temp1] = temp2partners[temp2] = temp1# 獲取客人數目
m = int(input())# 輸入客人集合
guests = set(map(int, input().split()))# 初始化列表以存儲落單客人
lonely_guests = []# 檢查是否為落單客人
for guest in guests:partner = partners.get(guest, None)if partner is None or partner not in guests:lonely_guests.append(guest)# 將落單客人按升序排序
lonely_guests.sort()# 輸出落單客人的數量
print(len(lonely_guests))# 如果有落單客人,則輸出其編號
if len(lonely_guests) > 0:print(" ".join("{:05d}".format(g) for g in lonely_guests))
以上代碼實現了題目要求的功能。我們首先通過輸入函數獲取已知夫妻/伴侶的對數 n
,已知夫妻/伴侶的ID號,參加派對的總人數 m
以及參加派對的客人的ID號。
然后,我們初始化一個字典 partners
以保存夫妻/伴侶的關系。在輸入夫妻/伴侶的ID號時,我們將每對ID號存儲在 partners
中。
接下來,我們初始化一個集合 guests
以保存參加派對的客人的ID號。在輸入參加派對的客人的ID號時,我們將每個ID號添加到 guests
中。
然后,我們遍歷每位客人,檢查其是否有伴侶參加派對。如果沒有,則將其ID號添加到結果列表 lonely_guests
中。
最后,如果有任何落單客人,則按升序排序并輸出他們的數量和ID號。