7-6 单身狗
作者 陈越 单位 浙江大学
“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。
输入格式:
输入第一行给出一个正整数 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
分析:
输入夫妻/伴侣的对数这种一对一有绑定意思感觉的数据,用map或者建一个50000的数组才存比较合适。用数组的方法就是couple[丈夫]=妻子;couple[妻子]=丈夫。用map就是妻子作为key,丈夫作为value;反之亦然。
怎么筛出落单的客人?从第一位客人0开始循环,再嵌套一个循环,从couple数组中找当前这位客人有没有伴侣,伴侣id是什么,同样从0开始直接一个个跟所有客人id比较,判断这位客人有没有落单。其实筛这个没什么难的,主要是要注意边界啊等等测试点。
最后输出需要按递增输出,就写个选择排序就可以。
通过的代码:
#include<stdio.h>
void sort( int a[], int n ){
int temp,min;
for(int i=0;i<n;i++){
min=i;
for(int j=i+1;j<n;j++){
if(a[min]>a[j]){
min=j;
}
}
//交换
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
int main(){
int coupleN;
int w,h;
scanf("%d",&coupleN);
int couple[100000]={0};
for(int i=0;i<coupleN;i++){
scanf("%d",&w);
scanf("%d",&h);
couple[w]=h;
couple[h]=w;
}
int M;
scanf("%d",&M);
int p[100000];
for(int i=0;i<M;i++){
scanf("%d",&p[i]);
}
if(coupleN>0){
int alone[100000];
int count=0;
for(int i=0;i<M;i++){
if(couple[p[i]]>=0){
int flag=0;
for(int j=0;j<M;j++){
if(couple[p[i]]==p[j]){
flag=1;
break;
}
}
if(flag==0){
alone[count]=p[i];
count++;
}
}else{
alone[count]=p[i];
count++;
}
}
sort(alone,count);
printf("%d\n",count);
if(count>0){
for(int i=0;i<count;i++){
if(i!=0){
printf(" ");
}
printf("%05d",alone[i]);
}
printf("\n");
}
}else{
sort(p,M);
printf("%d\n",M);
if(M>0){
for(int i=0;i<M;i++){
if(i!=0){
printf(" ");
}
printf("%05d",p[i]);
}
}
}
return 0;
}