浙大版《数据结构学习与实验指导(第2版)》-基础实验8-1.1:单身狗

93 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

@TOC


单身狗

单身狗

时间限制:0.2秒 空间限制:64M


题目描述

单身狗单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。


输入描述

输入第一行给出一个正整数 N(50000)N(≤50000),是已知夫妻/伴侣的对数;随后 NN 行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个 IDID 号,为 55 位数字(从 00000000009999999999),ID 间以空格分隔;之后给出一个正整数 M(10000)M(≤10000),为参加派对的总人数;随后一行给出这 MM 位客人的 IDID,以空格分隔。题目保证无人重婚或脚踩两条船


输出描述

首先第一行输出落单客人的总人数;随后第二行按 IDID 递增顺序列出落单的客人。IDID 间用 11 个空格分隔,行的首尾不得有多余空格。


样例一

输入

3
11111 22222
33333 44444
55555 66666
7
55555 44444 10000 88888 22222 11111 23333

输出

5
10000 23333 44444 55555 88888

题目分析

这是一道开心题(狗粮题),落单的客人有两种,一种是他对象没来,一种是他本身就是单身狗。

我们只需要记录每个人的对象的ID(初始值是-1,不能是0,因为有的ID是0),再记录都谁来了,就能看谁落单了。把落单的人记录下来,排个序就完事了。

注意事项

  • 这道题在PTA上,不能输出连续的两个空行。所以如果没有人落单,就不能输出两次换行。所以为了方便,输出完所有的落单人士后就不再输出换行了。
  • 注意ID是5位数字,小的ID需要前面补0

AC代码

#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << " = " << x << endl
#define fi(i, l, r) for (int i = l; i < r; i++)
#define cd(a) scanf("%d", &a)
typedef long long ll;
int a[100010]; // 对象数组,没对象的都是-1(不是0)
bool came[100010]={0}; // 是否来过
int b[100010]; // 来了谁
int main()
{
    memset(a, -1, sizeof(a)); // 初始化为-1
    int N;
    cin>>N;
    while(N--)
    {
        int x,y;
        cd(x),cd(y); // scanf
        a[x]=y,a[y]=x; // x的对象是y,y的对象是x
    }
    cin>>N;
    fi(i,0,N)
    {
        cd(b[i]); // scanf
        came[b[i]]=true; // b[i]来了
    }
    vector<int>ans; // 落单人士集合
    for(int i=0;i<N;i++)
    {
        int thisPeople=b[i]; // 这个人是b[i]
        if(a[thisPeople]!=-1&&came[a[thisPeople]]); // 如果有女朋友并且女朋友来了,就不是落单
        else ans.push_back(thisPeople); // 否则就是落单了
    }
    cout<<ans.size()<<endl; // 落单总人数
    sort(ans.begin(),ans.end()); // 排序
    for(int i=0;i<ans.size();i++)
    {
        if(i)putchar(' '); // PTA上需要控制格式
        printf("%05d",ans[i]);
    }
    return 0;
}

同步发文于我的CSDN,原创不易,转载请附上原文链接哦~ Tisfy:letmefly.blog.csdn.net/article/det…