1065 单身狗 (25 分)
作者:互联网
题目描述:
单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。
输入格式:
输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣的对数;随后 N 行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个 ID 号,为 5 位数字(从 00000 到 99999),ID 间以空格分隔;之后给出一个正整数 M(≤ 10 000),为参加派对的总人数;随后一行给出这 M 位客人的 ID,以空格分隔。题目保证无人重婚或脚踩两条船。
输入样例:
输出格式:
首先第一行输出落单客人的总人数;随后第二行按 ID 递增顺序列出落单的客人。ID 间用 1 个空格分隔,行的首尾不得有多余空格。
输出样例:
分析: 首先这道题思路很简单:如果参加派对的人没有伴侣或者伴侣不在派对,那么这个人id就是要输出的。设置一个数组arr1:arr1[i]=j表示i的伴侣为j,相应地设置arr1[j]=i。设置数组arr2,arr2[i]=1表示id为i的人在派对,为0表示不在。
遍历所有id(0-99999),找出arr1[i] == -1或者arr1[i]!=-1但arr2[arr1[i]]==0的所有id输出即可。
题目思路很容易想到,但有一些地方要注意。
- id为00000~00009的输出时要注意格式(输出格式用%05d)。
- 00000也是一个id,如果初始化arr1时按照习惯为0就错了(会导致一些样例点错误)。因为arr1[i]==0不能表示i没有伴侣,可能i的伴侣id为00000。所以可以初始化arr1为-1。
代码如下:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
int i, n, m, t1, t2;
vector<int> vec, arr1(100000,-1), arr2(100000,0);
cin>>n;
for(i = 0; i < n; i++){
cin>>t1>>t2;
arr1[t1] = t2;
arr1[t2] = t1;
}
cin>>m;
for(i = 0; i < m; i++){
cin>>t1;
arr2[t1] = 1;
}
for(i = 0; i < 100000; i++){
if(arr2[i] == 1){
if(arr1[i] == -1 || (arr1[i] != -1 && arr2[arr1[i]] == 0))
vec.push_back(i);
}
}
cout<<vec.size()<<endl;
sort(vec.begin(), vec.end());
for(i = 0; i < vec.size(); i++){
if(i == 0)
printf("%05d",vec[i]);
else
printf(" %05d",vec[i]);
}
return 0;
}
标签:25,单身,1065,t1,arr2,arr1,伴侣,ID,id 来源: https://blog.csdn.net/qq_44587299/article/details/120603470