1065. 单身狗(25)

原题: https://www.patest.cn/contests/pat-b-practise/1065

思路: 一眼看去题目中出现了很多大数字, 立马想到直接开大数组解决,
刷到第65题了, 这点直觉必然要有. 我的做法是开了两个数组, 一个存放
情侣的关系, 一个存放参加派对的访客. 要注意, 00000也是一个人, 所以
0不能作为数组默认值, 换个其它的就行.

提示大家一下 int arr[10] = {0}, 这是固定用法是能用在整型数组上,
并且只能赋0, 赋其它的都是错误的.

接下来就比较简单了, 我下面的代码情侣数组-1表示这个人不存在情况, 其它
情况都是表示有. 访客数组, 1表示有这个人, 2表示落单, 0就是用来充当默认
值换成其它也无所谓.

根据题意落单有2种情况

  1. 本来就没情侣
  2. 情侣没来

坑1: 别忘了0也是人
坑2: 最后打印的时候一定是05d

实现:

#include <stdio.h>
#define LEN 100010
int main (void) {
    int n;              // 情侣对数
    int nid[LEN];       // 互相存情侣号
    int m;              // 参加派对的总人数
    int mid[LEN] = {0}; // 1有这个人 2落单
    int single = 0;     // 落单客人的总人数
    int i;
    int tmp1;
    int tmp2;

    for (i = 0; i < LEN; i++) {
        nid[i] = -1; // 代表此人不存在
    }
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%d %d", &tmp1, &tmp2);
        // 互相存放自己的情侣号
        nid[tmp1] = tmp2;
        nid[tmp2] = tmp1;
    }
    scanf("%d", &m);
    for (i = 0; i < m; i++) {
        scanf("%d", &tmp1);
        mid[tmp1] = 1; // 标记为1, 这位客人参加了派对
    }

    for (i = 0; i < LEN; i++) {
        // i参加派对客人id
        if (mid[i] == 1) {
            if (nid[i] == -1) {
                single++;
                mid[i] = 2;
            } else {
                if (mid[nid[i]] != 1) {
                    single++;
                    mid[i] = 2;
                }
            }
        }
    }

    printf("%d\n", single);
    int first = 1;
    for (i = 0; i < LEN; i++) {
        if (mid[i] == 2) {
            if (first == 1) {
                // MD, 忘记了个5前面补零, 又耽误我
                // 1小时+ (这是测试点3)
                printf("%05d", i);
                first = 0;
            } else {
                printf(" %05d", i);
            }
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凯尔kyle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值