【题目来源】
https://pintia.cn/problem-sets/994805046380707840/exam/problems/994805117167976448?type=7&page=0
【题目描述】
当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。
【输入格式】
输入第一行给出一个正整数 N(≤100),是已知朋友圈的个数;
随后 N 行,每行首先给出一个正整数 K(≤1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个 ID 号,为 5 位数字(从 00000 到 99999),ID 间以空格分隔;
之后给出一个正整数 M(≤10000),为待查询的人数;
随后一行中列出 M 个待查询的 ID,以空格分隔。
注意:没有朋友的人可以是根本没安装“朋友圈”,也可以是只有自己一个人在朋友圈的人。
虽然有个别自恋狂会自己把自己反复加进朋友圈,但题目保证所有 K 超过 1 的朋友圈里都至少有 2 个不同的人。
【输出格式】
按输入的顺序输出那些帅到没朋友的人。
ID 间用 1 个空格分隔,行的首尾不得有多余空格。如果没有人太帅,则输出 No one is handsome。
注意:同一个人可以被查询多次,但只输出一次。
【输入样例1】
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888
【输出样例1】
10000 88888 23333
【输入样例2】
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111
【输出样例2】
No one is handsome
【算法分析】
● 没有朋友的人可以是根本没安装“朋友圈”,也可以是只有自己一个人在朋友圈的人。
大白话就是说,在列出的 M 个待查询的 ID 中,若在 N 行输入中没有出现,或单独出现在某行输入中,就是帅到没朋友的 ID。
● 题目保证所有 K 超过 1 的朋友圈里都至少有 2 个不同的人。
大白话就是说,ID 数量大于等于 2 的朋友圈中的 ID,除非是在 N 行输入中没有出现的,否则都不是所求。
● ID 号,为 5 位有前导 0 的数字(从 00000 到 99999)。所以需要用到如下语法,否则会报错。
%5d:右对齐;不足5位左补空格、大于5位按实际输出。
%05d:右对齐;不足5位左补0、大于5位按实际输出。
printf("%5d",1); //输出:****1(*为空格)
printf("%05d",1); //输出:00001
【算法代码一】
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int st[maxn];
int n,k,id;
int m;
int flag=0;
int main() {
memset(st,0,sizeof(st));
scanf("%d",&n);
while(n--) {
scanf("%d",&k);
for(int i=1; i<=k; i++) {
scanf("%d",&id);
if(k==1) break;
st[id]=1;
}
}
scanf("%d",&m);
while(m--) {
scanf("%d",&id);
if(!st[id]) {
if(flag==0) {
printf("%05d",id);
flag=1;
} else printf(" %05d",id);
st[id]=1;
}
}
if(flag==0) printf("No one is handsome");
return 0;
}
/*
in1:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888
out1:
10000 88888 23333
-----------------------------------------------
in2:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111
out2:
No one is handsome
-----------------------------------------------
in3:
2
1 11111
3 11111 33333 66666
2
11111 77777
out3:
77777
*/
【算法代码二】
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int st[maxn];
int main() {
int n,id,k;
scanf("%d",&n);
while(n--) {
scanf("%d",&k);
for(int i=1; i<=k; i++) {
scanf("%d",&id);
if(k!=1) st[id]++;
}
}
int m,cnt=0;
scanf("%d",&m);
for(int i=1; i<=m; i++) {
scanf("%d",&id);
if(st[id]==0) {
if(cnt==0) printf("%05d",id);
else printf(" %05d",id);
cnt++;
st[id]=-1;
}
}
if(cnt==0) printf("No one is handsome");
return 0;
}
/*
in1:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888
out1:
10000 88888 23333
-----------------------------------------------
in2:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111
out2:
No one is handsome
-----------------------------------------------
in3:
2
1 11111
3 11111 33333 66666
2
11111 77777
out3:
77777
*/
【参考文献】
https://blog.csdn.net/weixin_42861049/article/details/104656584
https://blog.csdn.net/zss6666yi/article/details/132844872
https://blog.csdn.net/qq_36734025/article/details/79627561
https://www.cnblogs.com/marswithme/p/16168393.html