1065 單身狗 (25 point(s))
阿新 • • 發佈:2021-09-07
#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 了。