PAT 1065. 单身狗(25)

“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。

输入格式:

输入第一行给出一个正整数N(<=50000),是已知夫妻/伴侣的对数;随后N行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M(<=10000),为参加派对的总人数;随后一行给出这M位客人的ID,以空格分隔。题目保证无人重婚或脚踩两条船。

输出格式:

首先第一行输出落单客人的总人数;随后第二行按ID递增顺序列出落单的客人。ID间用1个空格分隔,行的首尾不得有多余空格。

输入样例:

3
11111 22222
33333 44444
55555 66666
7
55555 44444 10000 88888 22222 11111 23333

输出样例:

5
10000 23333 44444 55555 88888

以遍历的方式判断客人是不是有夫妻会导致最后两个测试点运行超时。

直接将伴侣ID映射到数组上,省去遍历本体才CG

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #include<ctype.h>
 5 #include<math.h>
 6 int cmp(const void *a,const void *b){
 7     return *(int*)a-*(int*)b;
 8 }
 9 int main(){
10      int n;
11      int a[100010]={-1};
12      scanf("%d",&n);
13      int temp1,temp2;
14      for(int i=0;i<n;i++){
15          scanf("%d %d",&temp1,&temp2);
16          a[temp1] = temp2;
17          a[temp2] = temp1;
18      }
19      int m;
20      scanf("%d",&m);
21      int b[100010];
22      for(int i=0;i<m;i++){
23          scanf("%d",&b[i]);
24      }
25      int c[100010];
26      int h = 0;
27      int i,j;
28      int temp;
29      int k;
30      for(i=0;i<m;i++){
31          if(a[b[i]]!=-1){
32              temp = a[b[i]];
33              for(j=0;j<m;j++){
34                  if(b[j]==temp){
35                      break;
36                  }
37              }
38              if(j==m){
39                  c[h++] = b[i];
40              }
41          }
42          else{
43              c[h++] = b[i];
44          }
45      }
46      
47      
48      
49      qsort(c,h,sizeof(int),cmp);
50      printf("%d
",h);
51      for(i=0;i<h;i++){
52          if(!i)
53              printf("%05d",c[i]);
54          else
55              printf(" %05d",c[i]);
56      }
57      
58      
59 } 
原文地址:https://www.cnblogs.com/lolybj/p/6477060.html