PAT乙級 1065 單身狗題目
阿新 • • 發佈:2018-12-27
“單身狗”是中文對於單身人士的一種愛稱。本題請你從上萬人的大型派對中找出落單的客人,以便給予特殊關愛。
輸入格式:
輸入第一行給出一個正整數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; }