PAT乙级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.先建一个数组存储对子——下标与对应元素相对
2.再建一个数组表示落单人数,每输入一个,判断是否有对子,有则相消,无则加入

首次通过代码:
 1 #include<stdio.h>
 2 
 3 void output(int i){
 4     if(i<10) printf("0000%d",i);
 5     else if(i<100) printf("000%d",i);
 6     else if(i<1000) printf("00%d",i);
 7     else if(i<10000) printf("0%d",i);
 8     else printf("%d",i);
 9 }
10 
11 int main(){
12     int couple[100000]={-1};//记录对子编号
13     int single_people[100000]={0};
14     int part;
15     scanf("%d",&part);
16     for(int i=0;i<part;i++){
17         int a,b;
18         scanf("%d %d",&a,&b);
19         couple[a]=b;
20         couple[b]=a;
21     }
22     int sum;int amount=0;
23     scanf("%d",&sum);
24     for(int i=0;i<sum;i++){
25         int a;
26         scanf("%d",&a);
27         if(single_people[couple[a]]==1) {
28            single_people[couple[a]]=0;
29            amount--;
30         }
31         else {
32           single_people[a]=1;
33           amount++;
34         }
35     }
36     printf("%d
",amount);
37     for(int i=0;i<100000;i++){
38         if(single_people[i]==1) {
39             output(i);amount--;
40             if(amount>=1) printf(" ");
41         }
42     }
43     return 0;
44 }
View Code
 
原文地址:https://www.cnblogs.com/a982961222/p/12365509.html