1. 程式人生 > 其它 >1065 單身狗 (25 point(s))

1065 單身狗 (25 point(s))

#include <bits/stdc++.h>
using namespace std;

int main() {
	// N 夫妻/伴侶的對數 ID 號  5 位數字
	// M 派對的總人數 M 位客人的 ID
	int n, m;
	map<string, string> couples;
	set<string> guests, dogs; 
	
	cin >> n;
	while(n--){
		string str1, str2;
		cin >> str1 >> str2;
		
		// 夫妻可以互相找到 
		couples[str1] = str2, couples[str2] = str1;
	}
	
	cin >> m;
	while(m--){
		string str;
		cin >> str;
		guests.insert(str);
	}
	
	for(auto g: guests){
		// 不是夫妻 
		if(couples.find(g) == couples.end()) 
			dogs.insert(g);
		// 夫妻 但是物件沒來
		else if(guests.find(couples[g]) == guests.end()) 
			dogs.insert(g);
	}
	
	// 第一行 落單 總人數
	cout << dogs.size() << endl;
	
	// 第二行按 ID 遞增 列出落單客人
	int first = 0;
	for(auto d: dogs){
		cout << (first++ ? " " : "") << d;
	}
}

用 map 捆綁夫妻關係,以便可以從名字找到該名字另一半。

剛開始沒有仔細看資料樣例,只根據文字就入手了,以為派對上把具有夫妻身份的人排除了就可以了。但是測試發現,有些是有夫妻關係的,但也要算入“單身狗”裡面。這題還滿迷的。


如果用 string 型別來讀取 ID 後面就不需要補齊高位的 0 了。很多題目都是這樣,說是數字實際上數字可能前面有 0 會導致 0 讀取時被丟棄了。還不如直接用 string 。

不過如果用 int 的話,看別人也可以用兩個函式來補救一下,一個是 setw,設定輸出時候的寬度,小於寬度的時候預設填充空格。再一個是 setfill,設定填充的字元,用來搭配前面的函式,設定一個 '0' 替換原來的空格。這樣就可以高位補 0 了。

參考程式碼

setfill()函式