1065. 单身狗(25)(C++)

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

输入格式:

输入第一行给出一个正整数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
思路:构造一个结构体couple,a记录其伴侣序号,couple x[i]=j指i的伴侣为j。b记录到来情况,当一方到场的的话,b=-1,让另一方来的时候,只需看其伴侣的b是否为-1即可。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef struct{
	int a;
	int b;
}couple;
int main(){
	int n;
	couple q[100000];
	for(int i=0;i<100000;i++){
		q[i].a=-1;
		q[i].b=0;
	}
	cin>>n;
	for(int i=0;i<n;i++){
		int x,y;
		cin>>x>>y;
		q[x].a=y;
		q[y].a=x;
	}
	int m;
	cin>>m;
	vector<int>z;
	int sum;
	sum=m;
	for(int j=0;j<m;j++){
		int c;
		cin>>c;
		z.push_back(c);
		if(q[c].a!=-1){
			q[c].b=-1;
			if(q[q[c].a].b==-1){
				q[c].b=1;
				q[q[c].a].b=1;
				sum-=2;
			}
		}
	}
	cout<<sum<<'\n';
	sort(z.begin(),z.end());
	int flag=1;
	for(int k=0;k<z.size();k++){
		if(q[z[k]].b!=1&&flag==1){
			printf("%05d",z[k]);
			flag=0;
		}
		else if(q[z[k]].b!=1&&flag==0){
			printf(" %05d",z[k]);
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_41562704/article/details/79327146