1065 单身狗 (25分)

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

思路分析:借鉴柳神!
先设一个数组couple[i]=j,表示j的对象是i。一开始都设置为1,设立数组isExist表示某人的对象是否来到了派对上。接收数据时,将一对情侣进行绑定,即couple[a]=b,couple[b]=a;对于每一个需要判断的人,存储在guest[]数组中;如果他不是单身的(即couple[guest[i]]!=-1),那么就将他的对象isExist设置为1,表示它对象的对象来了。这样最isExist不为1的人,就是对象没有来的人。把所有人遍历后插入一个set集合,集合大小就是落单人数,集合里面的元素据说所求人的递增序列。

代码时间:

#include 
#include 
#include 

using namespace std;

int main()
{
    int n,a,b,m;
    cin>>n;
    vector<int> couple(100000,-1);//初始值都设为-1
    for(int i=0;i<n;i++){
        cin>>a>>b;
        couple[a]=b;
        couple[b]=a;//配对,情侣绑定
    }
    cin>>m;
    vector<int> guest(m),isExist(100000);
    for(int i=0;i<m;i++){
        cin>>guest[i];
        if(couple[guest[i]]!= -1)//说明他不是单身的
        isExist[couple[guest[i]]]=1;//将他对象的isExist设置为1,表示他的对象的对象来了,也就是他自己来了
    }
    set<int> s;
    for(int i=0;i<m;i++){
        if(!isExist[guest[i]])
            s.insert(guest[i]);
    }
    cout<<s.size()<<endl;
    for(auto it=s.begin();it!=s.end();it++){
        if(it!=s.begin())
            cout<<' ';
      printf("%05d",*it);
    }
    return 0;
}

柳神题解

你可能感兴趣的:(PAT乙级真题)