当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。
输入格式:
输入第一行给出一个正整数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
若用一般方法,则会消耗大量时间,无法通过最后的测试点,比如如下代码
#include<stdio.h>
int GetNData(int id[],int num);
int GetNCheckID(int check[],int num);
void PrintResult(int id[],int numid,int check[],int numch);
int IsHaving(int array[],int num,int integer);
main()
{
int numin,numid,numch,effnumch,id[100*1000]={0},check[10000]={0};
scanf("%d",&numin);
numid=GetNData(id,numin);
scanf("%d",&numch);
effnumch=GetNCheckID(check,numch);
PrintResult(id,numid,check,effnumch);
}
int GetNData(int id[],int num)
{
int i,j,total=0,friends;
for(i=0;i<num;i++){
scanf("%d",&friends);
for(j=0;j<friends;j++){
scanf("%d",id+total);
if(friends!=1) total++;
}
}
return total;
}
int GetNCheckID(int check[],int num)
{
int i,*p=check,effnum=0;
for(i=0;i<num;i++){
scanf("%d",p);
if(!IsHaving(check,effnum,*p)) {
p++;
effnum++;
}
}
return (effnum);
}
void PrintResult(int id[],int numid,int check[],int numch)
{
int i,total=0;
for(i=0;i<numch;i++){
if(!IsHaving(id,numid,check[i])) {
if(total) printf(" ");
printf("%05d",check[i]);
total=1;
}
}
if(total==0) printf("No one is handsome\n");
}
int IsHaving(int array[],int num,int integer)
{
int i,*p=array;
for(i=0;i<num;i++){
if(*p++==integer) return 1;
}
return 0;
}
注意到我们可以用类似桶排的思想来解决这题这样减少了判断是否重复的时间耗用
#include<stdio.h>
#define MaxID 100000
#define MaxCheck 10000
/*输入N个朋友圈的朋友ID,若朋友圈朋友大于1,则其朋友不帅,并用judge[]来存储该信息*/
void GetNCirIDAndProcess(int judge[],int numcir);
/* 输入查询ID并存储到数组check[],返回查询ID个数;*/
int GetCheck(int check[]);
/*输出相应结果*/
void PrintResult(int judge[],int check[],int numcheck);
main()
{
int numcir,numcheck, judge[MaxID]={0},check[MaxCheck];
scanf("%d",&numcir);
GetNCirIDAndProcess(judge,numcir);
numcheck=GetCheck(check);
PrintResult(judge,check,numcheck);
}
void GetNCirIDAndProcess(int judge[],int numcir)
{
int i,j,numfriends,id;
for(i=0;i<numcir;i++){
scanf("%d",&numfriends);
for(j=0;j<numfriends;j++){
scanf("%d",&id);
if(numfriends!=1) judge[id]=1;
}
}
}
int GetCheck(int check[])
{
int i,numcheck;
scanf("%d",&numcheck);
for(i=0;i<numcheck;i++)
scanf("%d",check+i);
return (numcheck);
}
/*用flag来判断有无帅的人以及是否第一个输出;当输出一个后,相应的judge变1,保证不重复输出*/
void PrintResult(int judge[],int check[],int numcheck)
{
int i,flag=0;
for(i=0;i<numcheck;i++){
if(judge[check[i]]==0){
if(flag) printf(" ");
printf("%05d",check[i]);
judge[check[i]]=1;
flag=1;
}
}
if(!flag) printf("No one is handsome\n");
}