单身狗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;
}

posted @ 2023-12-23 21:26  CV小能手chh  阅读(5)  评论(0)    收藏  举报  来源