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

PAT-乙級-1065 單身狗

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

輸入格式:

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



分析:
  建立一個下標為id的陣列arr,初始化為全0
  輸入每隊夫婦x,y時將將陣列置為:arr[x]=y+1;arr[y]=x+1;
  接下來輸入id時對陣列進行判斷
    如果為0,置為-1
    如果不為0,則判斷該夫婦是否都到場
  最後遍歷arr,輸出置為-1的下標即可



 1 //c
 2 
 3 #include <stdio.h>
 4
#define MAX 100000 5 6 int main(){ 7 int arr[100000]={0}; 8 int n,x,y; 9 scanf("%d",&n); 10 while(n--){ 11 scanf("%d%d",&x,&y); 12 arr[x]=y+1;//防止與id:0衝突 13 arr[y]=x+1; 14 } 15 scanf("%d",&n); 16 int res=0; 17 while(n--){ 18 scanf("%d",&x); 19 if(arr[x]==0
){ 20 arr[x]=-1; 21 res++; 22 } 23 else{ 24 if(arr[arr[x]-1]==(x+1)){//出現一隊夫婦的第一人 25 arr[x]=-1; 26 res++; 27 } 28 else{//出現第二人 29 arr[arr[x]-1]=-2; 30 arr[x]=-2; 31 res--; 32 } 33 } 34 } 35 int f=0; 36 printf("%d\n",res); 37 for(int i=0;i<MAX;i++){ 38 if(arr[i]==-1){ 39 if(f) 40 printf(" "); 41 printf("%05d",i); 42 f=1; 43 } 44 } 45 }