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