PAT 1065單身狗的程式碼實現及錯誤分析(C語言)
阿新 • • 發佈:2019-02-13
題目
“單身狗”是中文對於單身人士的一種愛稱。本題請你從上萬人的大型派對中找出落單的客人,以便給予特殊關愛。
輸入格式:
輸入第一行給出一個正整數 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陣列,陣列下標即為每個人ID,將某ID的伴侶的ID存入該ID下標的值中,設定對應標誌位陣列,值0代表未到場,1代表一個人到場,2代表夫妻到場。對到會的ID進行逐個檢測,到會即標誌位置為1,若伴侶已到場,則雙方都置為2,計數夫妻對數。輸出單人個數,輸出標誌位為1的ID。
1.定義個數足夠的ID陣列和標誌位陣列,均初始化為0(如果嚴謹考慮,ID陣列應初始化為負數,因為0值也是一個人的ID,如果ID為00000的人有伴侶,則所有人的預設伴侶都成了00000,測試用例中未出現);
2.逐個檢測到場ID,若標誌位為0,則置為1,若伴侶已到場,則雙方置為2,計數到場伴侶對數;
3.輸出單個人個數,並遍歷ID陣列,輸出所有標誌位為1的ID。
程式碼如下:
#include<stdio.h> int main() { int N=0,a=0,b=0; int iD[100000]={0};//儲存夫妻對應關係 int iFlag[100000]={0};// 標誌位,0-不存在,1-一個人到場,2-夫妻到場 scanf("%d",&N); for(int i=0;i<N;i++) { scanf("%d%d",&a,&b); iD[a]=b;//將有伴侶的ID資料存入,注意存入雙方的 iD[b]=a; } int iCnt=0,M=0; scanf("%d",&M); for(int i=0;i<M;i++) { scanf("%d",&a); iFlag[a]++;//本人到場,本人標誌位加1 if(iFlag[iD[a]]==1)//若伴侶已到場,則雙方標誌位都加1 { iFlag[a]++; iFlag[iD[a]]++; iCnt++; } } printf("%d\n",M-2*iCnt); int cnt=0; for(int i=0;i<100000;i++) { if(iFlag[i]==1&&cnt==0) { printf("%05d",i); cnt++; } else if(iFlag[i]==1) { printf(" %05d",i); cnt++; } if(cnt==M-2*iCnt)//在輸出完畢後及時退出,減少迴圈次數 { break; } } return 0; }
錯誤分析:
1.題目理解要正確,示例表明伴侶單人到場算單身;
2.輸出時要注意格式,%05d,避免小數字位數不夠。