单身狗c语言版
基本思路
哈希表存储关系,另外一个表存是否出席,然后遍历出席名单排除
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int main()
{
int *a = (int *)malloc(sizeof(int) * 100001);//哈希表存储关系
memset(a, 0xff, sizeof(int) * 100001);//注意有0号客人,所以这里标记为-1
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
int x, y;
scanf("%d %d", &x, &y);
a[x] = y;
a[y] = x;
}
int m;
scanf("%d", &m);
int b[m];//出席人员,这里使用可变数组,如果编译器不支持,可以像a[]一样定义
int ex[100001]={0};// 出席标记
for (int i = 0; i < m; i++)
{
scanf("%d", &b[i]);
ex[b[i]] = 1;
}
for (int i = 0; i < m; i++)
{
if (a[b[i]] != -1 && ex[b[i]] && ex[a[b[i]]])//注意数组索引不能为-1
b[i] = 0;
}
qsort(b, m, sizeof(int), cmp);//排序
int l = 0;
while (b[l] == 0)//找到第一个成员,还是注意有0号客人,不能用b[L]
l++;
printf("%d\n", m - l);
for (int i = l; i < m; i++)
{
printf("%05d", b[i]);//注意这里五位数字输出,前面补零
if (i != m - 1)
printf(" ");
}
free(a);
// system("pause");
return 0;
}

浙公网安备 33010602011771号