PTA basic 1065 单身狗 (25 分) c++语言实现(g++)

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

输入格式:

输入第一行给出一个正整数 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
 

输出样例:

5
10000 23333 44444 55555 88888

 

 

解题思路

1.核心思路就一点 用一个100000大小的数组存储数据,下标就是对应一个人的编号,然后数据存储对方的编号,快速索引对方编号

2.注意输出格式 如果单身人数为0 只输出一个"0" 的人数就可以

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;

int main(){
    int n,m,temp,a,b,i;
    cin >>n;
    vector<int> markList(100000);//核心思路  用一个100000的数组存储对方的编号 快速索引对方编号 不用遍历
    vector<int> guestList;
    vector<int> singleList;
    for(int i=0;i<n;i++){
        scanf("%d %d",&a,&b);
        markList[a]=b;
        markList[b]=a;
    }
    cin >> m;
    for(int i=0;i<m;i++){
        cin >>temp;
        guestList.push_back(temp);
    }
    for(int i=0;i<m;i++){
        if(guestList[i]!=-1){
            int partner=markList[guestList[i]];
            vector<int>::iterator it=find(guestList.begin(),guestList.end(),partner);
            if(it!=guestList.end()){
                *it=-1;//迭代器找到元素时,*it解引用就是该元素 将该元素的值赋为-1 
                guestList[i]=-1;//同时guestList[i]也赋值为 -1  筛选guest单身时,将-1值的元素排除 剩下的就是单身
            }
        }
    }
    
    sort(guestList.begin(), guestList.end());
    for(int i=0;i<m;i++){
        if(guestList[i]!=-1){
            singleList.push_back(guestList[i]);
        }
    }
    
    cout << singleList.size()<<endl;//输出单身人数
    
    if(singleList.size()){//测试点1  没有单身编号时不输出
        for(i=0;i<singleList.size()-1;i++){
            cout <<setw(5)<<setfill('0') <<singleList[i]<<" ";
        }
        cout <<setw(5)<<setfill('0') <<singleList[i]<<endl;
    }
    return 0;
}

 

posted @ 2021-05-10 19:57  keiiha  阅读(171)  评论(0编辑  收藏  举报