1. 程式人生 > >PAT乙級1065. 單身狗(C語言)

PAT乙級1065. 單身狗(C語言)

AC

/* 
 * 1. 單身狗的判斷:
 *   1.1 沒有物件;
 *   1.2 有物件,兩人中只有一人蔘加派對;
 * 2. 以ID為陣列下標記錄情感狀況;
 * 3. 有物件的人,參加派對的人做特殊標記;
 */
#include <stdio.h>
#include <stdlib.h>

int main() {
    int N, M, cp[100000];//伴侶的對數,派對總人數,記錄情感狀況
    scanf("%d", &N);
    for (int i = 0; i < 100000; i++) {//初始化情感狀況
        cp[i] = -1
; } int a, b; for (int i = 0; i < N; i++) {//讀取N行情侶的id scanf("%d %d", &a, &b); cp[a] = b;//記錄id對應的情侶id cp[b] = a; } scanf("%d", &M); int all[M], cnt_dog = 0;//所有人員的id,單身狗的數量 for (int i = 0; i < M; i++) {//讀取所有參加派對的人的id scanf("%d"
, &all[i]); if (cp[all[i]] == -1) {//如果沒有物件 cnt_dog++; cp[all[i]] = -3;//更新單身狗的標記 } else {//如果有物件,將值設為-2,表示自己參加 cp[all[i]] = -2; } } for (int i = 0; i < 100000; i++) {//篩選有物件的人之中的單身狗 if (cp[i] > -1 && cp[cp[i]] == -2
) {//自己沒參加,物件參加 cnt_dog++; cp[cp[i]] = -3;//改為單身狗狀態 } } printf("%d\n", cnt_dog); for (int i = 0; i < 100000 && cnt_dog > 0; i++) { if (cp[i] == -3) {//輸出單身 printf("%05d", i); if (cnt_dog != 1) { printf(" "); } cnt_dog--; } } return 0; }