1065 单身狗 (25 分)

题目:1065 单身狗 (25 分)

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

输入格式:

输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣的对数;随后 N 行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个 ID 号,为 5 位数字(从 00000 到 99999),ID 间以空格分隔;之后给出一个正整数 M(≤ 10 000),为参加派对的总人数;随后一行给出这 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

思路:

  • 将已知伴侣关系用结构体进行捆绑。关键在于如何判断落单嘉宾。先判断此嘉宾本身是否有伴侣关系,若有则查找伴侣是否到场,未到场则是落单,也算是做了一回单身贵族。这个寻找直接往后找,找到后将两者排除在落单户行列,用-1表示。排除后就不用重复判断了。详情见代码,有注释。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cctype>
 4 #include <iostream>
 5 #include <sstream>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <string>
 9 #include <stack>
10 #include <queue>
11 #include <vector>
12 #include <map>
13 using namespace std;
14 
15 struct node{
16     int c1, c2;
17 }couple[50005];
18 
19 int iscouple[100005];
20 
21 int main()
22 {
23     memset(iscouple, -1, sizeof(iscouple));    //避免与编号00000冲突 
24     int n, m;
25     int guest[100005], single[100005];
26     scanf("%d", &n);
27     for(int i = 0; i < n; i++)     //记录伴侣关系 
28     {
29         scanf("%d %d", &couple[i].c1, &couple[i].c2);
30         iscouple[couple[i].c1] = couple[i].c2;
31         iscouple[couple[i].c2] = couple[i].c1;        
32     }
33     scanf("%d", &m);
34     for(int i = 0; i < m; i++)    //输入到场来宾 
35     {
36         scanf("%d", &guest[i]);        
37     }
38     int cnt = 0;
39     for(int i = 0; i < m; i++)
40     {
41         if(iscouple[guest[i]] != -1 && guest[i] != -1)    //原本就有伴侣关系存在 ,找伴侣是否有到场。不重复找 
42         {
43             int j;
44             for(j = i+1; j < m; j++)
45             {
46                 if(iscouple[guest[i]] == guest[j])    //伴侣到场,双方都不落单 
47                 {
48                     guest[i] = -1;
49                     guest[j] = -1;
50                     break;    //只有一个伴侣 
51                 }
52             }
53             if(j == m)    //伴侣没来 
54                 single[cnt++] = guest[i];
55         }
56         else if(iscouple[guest[i]] == -1 && guest[i] != -1)    //本就是单身贵族 
57         {
58             single[cnt++] = guest[i];
59         }
60     }
61     sort(single, single + cnt);    //将单身贵族的编号从小到大排序 
62     printf("%d\n", cnt); 
63     for(int i = 0; i < cnt; i++)
64     {
65         printf("%05d", single[i]);
66         if(i != cnt-1)
67             printf(" ");
68     }
69     return 0;
70 }

 

总结:

  思路一下就有了,测试程序时总是有个-00001,经过调试发现原本的代码在本就是单身贵族那里直接else了,也就是没有考虑到iscouple【-1】也有不等于-1的情况,但这里面的-1是嘉宾被排除在落单户名单外的。考虑进去后就全过了。
  调试熟练程度不够,反应太慢。改bug能力有待提高。

posted @ 2019-08-31 14:41  Anzer  阅读(537)  评论(0编辑  收藏  举报