PAT-B 1065 單身狗【對映+集合】

Enjoy_process發表於2019-02-25

                                             PAT-B 1065 單身狗

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

 

 

題目

“單身狗”是中文對於單身人士的一種愛稱。本題請你從上萬人的大型派對中找出落單的客人,以便給予特殊關愛。

輸入

輸入第一行給出一個正整數 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

分析

用map<int,int>記錄每個人的伴侶,用set<int>記錄到場的人,如果客人本身沒有伴侶或者有伴侶但是伴侶沒來,則進行統計,具體看程式。 

C++程式

#include<iostream>
#include<algorithm>
#include<set>
#include<map>

using namespace std;

map<int,int>d;//存放配偶的資訊 
set<int>s;//存放到場的客人 

int main()
{
	int n,m,a,b;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d%d",&a,&b);
		d[a]=b;//a、b互為伴侶 
		d[b]=a; 
	}
	scanf("%d",&m);
	while(m--)
	{
		scanf("%d",&a);
		s.insert(a);
	}
	int num=0;
	//遍歷到場的人 
	for(set<int>::iterator it=s.begin();it!=s.end();it++)
		if(d.count(*it)==0||s.count(d[*it])==0)//如果客人*it本身沒有伴侶或者有伴侶但是伴侶沒來 
		  num++;
	printf("%d\n",num);
	bool flag=false;
	for(set<int>::iterator it=s.begin();it!=s.end();it++)
		if(d.count(*it)==0||s.count(d[*it])==0)
		{
			if(flag) printf(" ");
			printf("%05d",*it);
			flag=true;//標記已經有輸出了 
		}
	if(flag) printf("\n");
	return 0;
}

 

相關文章