1. 程式人生 > >PAT乙級 1065 單身狗題目

PAT乙級 1065 單身狗題目

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

輸入格式:

輸入第一行給出一個正整數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
解題分析
解題關鍵是尋找夫妻伴侶對同時存在參加派對隊伍中的對數。關鍵函式為陣列中的find函式。
用法例項
int temp[100]={3,4,2,1}
find(temp,temp+100,1)//返回找到的記憶體地址,取* 可以重新賦值如 temp[3]=1;*find(temp,temp+100,1)=2;此時temp[3]=2;//如找不到 *find(temp,temp+100,1)==0 

程式碼
#include<iostream>
#include<string>
#include <algorithm> 
#include<iomanip>
using namespace std;

int main()
{
	int n,m; //題目的N,M 
	cin>>n;
	int id[50000][2]={}; //定義二維陣列存夫妻伴侶對編號。 
	int couples=0;  //參加派對的夫妻對數。 
	for(int i=0;i<n;i++) //輸入已知的夫妻伴侶ID,成對輸入。 
	{
		do
		{
			cin>>id[i][0]>>id[i][1];
		}while(getchar()!='\n');
	}
	
	cin>>m;
	int *peopleid=new int [m]; //定義動態一維陣列存參加派對的人員編號。 
	for(int i=0;i<m;i++)
		cin>>peopleid[i];	
	for(int i=0;i<n;i++) //迴圈查詢, id[i][0]和 id[i][1]同時存在 
	{
		if((*find(peopleid,peopleid+m,id[i][0])==id[i][0])&&(*find(peopleid,peopleid+m,id[i][1])==id[i][1]))//關鍵程式碼
		{
				couples++;
				*find(peopleid,peopleid+m,id[i][0])=1000000;  //將存在的夫妻編號賦值1000000,控制不輸出。 
				*find(peopleid,peopleid+m,id[i][1])=1000000;		
		}
	}
	sort(peopleid,peopleid+m);	//排序,題目要求從小到大 
	cout<<m-couples*2<<endl; //落單人數	
	if(m-couples*2!=0)
	{
		cout<<setiosflags(ios::right)<<setfill('0')<<setw(5)<<peopleid[0];//控制輸出	
		for(int i=1;i<m;i++)
		{
		if(peopleid[i]!=1000000)
			cout<<' '<<setw(5)<<peopleid[i];
		else
			break;
				
		}
		
	}
	delete [] peopleid;

	
	return 0;
}