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 了。
浙公网安备 33010602011771号