PAT-B 1065. 单身狗(25)

传送门

https://pintia.cn/problem-sets/994805260223102976/problems/994805266942377984

题目

“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。
输入格式:
输入第一行给出一个正整数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

分析

真是一道恶趣味的题,不过作为最后一道,难度倒是不大。
1.建立一个伴侣表,用每个人ID作为索引,在其索引下,存放夫妻/伴侣的ID;
举例来讲,若11111和22222互为伴侣,则table[11111]=22222,table[22222]=11111。
2.先把所有参加排队的宾客ID存到数组里面;
3.遍历宾客数组,查找对应伴侣表里面的伴侣是否能在宾客的数组找到,如果找不到,说明是单身狗,将其加入到单身狗的数组里面;
4.遍历宾客数组完成后,对单身狗数组排序(升序);
5.遍历输出单身狗数组。

注意:ID不足五位的,要用0补位,就这一个坑。

对了,还有,末尾不要输出一个换行符,容易有错。
强迫症是病,得治。

源代码

//C/C++实现
#include 
#include 
#include 

using namespace std;

int table[100000];

int main(){
    int n;
    scanf("%d", &n);
    int a, b;
    for(int i = 0; i < n; ++i){
        scanf("%d %d", &a, &b);
        //建立相互映射关系 
        table[a] = b;
        table[b] = a;
    }
    scanf("%d", &n);
    vector v(n);
    vector doge;
    for(int i = 0; i < n; ++i){
        scanf("%d", &v[i]);
    }
    for(int i = 0; i < n; ++i){
        vector::iterator result = find(v.begin(), v.end(), table[v[i]]);
        if(result == v.end()){ //说明没找到他/她的伴侣 
            doge.push_back(v[i]); //单身狗的队伍又壮大了 
        }
    }
    sort(doge.begin(),doge.end());
    printf("%d\n", doge.size());
    for(int i = 0; i < doge.size(); ++i){
        if(i == 0){
            printf("%05d", doge[i]);
        }       
        else{
            printf(" %05d", doge[i]);
        }
    }
//  printf("\n");
}

你可能感兴趣的:(PAT-B 1065. 单身狗(25))