题意解析:给出朋友圈的个数,每个朋友圈的人数,以及查询的次数,输出查询中是帅到没朋友的人的ID(这里ID用字符串或整型数字存储均可,不过字符串不需要填补前缀0),所谓帅到没朋友的人,即未在1人以上(需要注意,如果一个朋友圈只有一个人,那么也不能算是有朋友)朋友圈中出现过的人,同一个人可能存在于多个朋友圈中,并且,查询过程中可能存在重复的查询内容,但是重复的查询内容只输出一次,这里需要去重操作。
基于这道题的特性,使用set来进行处理会比较简便,我们可以将所有人数大于1的朋友圈视作一个整体,遍历插入到一个set类型变量中,基于set的去重性质,即使一个人混迹于多个朋友圈,我们也只会记录一次,而最终的查询过程,我们可以再创建一个set类型变量来记录是否输出过了,每找到一个没有朋友的人,输出的同时插入到该变量中,下次遇到没有朋友的人,先在变量中查找是否存在(即检验是否输出过,避免重复输出),这样完成查询过程即可
Code:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, m, x;//n是朋友圈的个数 m是每个朋友圈中人的数量 x是查询的次数
string ch;//字符串变量,用于字符串输入
cin >> n;
set<string> s; // 定义set类型变量(set的作用在于去重,重复插入时不会插入进去)
//这里s1是用来记录出现在多人朋友圈里的人,这些人不是帅到没有朋友的人
//后续我们只需要判断查询的人有没有在s里,就能知道他是不是帅到没朋友的人了
while(n -- ){//进行朋友圈的遍历
cin >> m;
if(m == 1) {//注意,如果朋友圈中只有一个人时,这个人并不算有朋友,此时跳过即可
cin >> ch;
continue;
}
while(m -- ){//m大于1时刻,至少有两个不同的人,可以保证这些都会是有朋友的人
cin >> ch;
s.insert(ch);
}
}
cin >> x;
set<string> s2;//s2用来记录输出过的帅到没朋友的人,因为查询可能存在重复的数据,但只要求输出一次,所以用这种方式进行筛查,避免重复输出
while(x -- ){
cin >> ch;
if(s.find(ch) == s.end()){//如果这个人没有朋友
if(s2.find(ch) != s2.end()) continue;//判断这个人有没有输出过
if(s2.size() == 0) cout << ch;//因为格式要求,所以需要特判第一个输出的数据
else cout << ' ' << ch;
s2.insert(ch);//输出过的数据插入到s2中,避免重复输出
}
}
if(s2.size() == 0) cout << "No one is handsome";//如果一个都没有输出,那么表示没有帅到没朋友的人,直接输出题目要求内容即可
return 0;
}