1. 程式人生 > >PAT 1065單身狗的程式碼實現及錯誤分析(C語言)

PAT 1065單身狗的程式碼實現及錯誤分析(C語言)

題目

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

輸入格式:

輸入第一行給出一個正整數 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,避免小數字位數不夠。