题目: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能力有待提高。