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.再建一个数组表示落单人数,每输入一个,判断是否有对子,有则相消,无则加入
首次通过代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }