PTA 单身狗

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比较,判断这位客人有没有落单,把落单的客人同一放在另一个数组。

  其实筛出非单身客人没什么难的,主要是要注意边界啊等等测试点。我就错了一个测试点:ID 取上下界, 无人单身。我把00000给忘了,例如00000和22222是伴侣时,couple[22222]就会等于0;但是我一开始给couple初始化的就是0,这导致筛查客人的时候就会认为22222没有伴侣。所以要把couple初始化为-1,区分出00000。

  最后输出需要按递增输出,就写个选择排序就可以。选择排序就是循环数组长度的次数,每次将后面最小的元素换到最前面。

 

通过的代码:

复制代码
#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;
}
复制代码

 

 

posted @   吧拉吧拉吧  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示