1065. 单身狗(25)

这题的关键在于对一群人怎么区分他门的配偶来没来?这其实是一个很现实的例子:
简单的办法就是对于每个现场的人报他们配偶的id,没配偶的不报,记录在一个名单list。
这样下来,现场的没被人报到的就是单身狗。
注意:
一个人被人报到说明他自己和他配偶都在现场,他俩都会在名单上。

#include 
#include 
#include 
using namespace std;
#define MAX 100005
int main(){
    //spouse_id需初始化为-1,因为00000也是个id
    int N, man, woman, M, spouse_id[MAX] = {-1}, list[MAX] = {0}, guest[10005] = {0};

    scanf("%d", &N);

    for(int i = 0; i < N; i++){         //有配偶的话值不为0,而为配偶的id
        scanf("%d%d", &man, &woman);
        spouse_id[man] = woman;
        spouse_id[woman] = man;
    }

    scanf("%d", &M);
    set<int> s;

    for(int i = 0; i < M; i++){
        scanf("%d", &guest[i]);               //某个人到现场了
        if(spouse_id[guest[i]] != -1)         //如果这个人有配偶
            list[spouse_id[guest[i]]] = 1;    //把他的配偶id登记在名单list上
    }
    for(int i = 0; i < M; i++){         //遍历所有到现场客人
        if(!list[guest[i]])             //名单上没他,他肯定是单身狗啊
            s.insert(guest[i]);         //插入到单身狗名单
    }
    printf("%d\n", s.size());       
    for(set<int>::iterator it = s.begin(); it != s.end(); it++) { //set中按字典自动排序
        if (it != s.begin()) 
            printf(" ");
        printf("%05d", *it);
    }
}

你可能感兴趣的:(PAT乙级初步题解)