L2-012关于堆的判断

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

#define MAX_SIZE 1000

int H[MAX_SIZE]; // 小顶堆,用于存储堆中的元素
int size = 0;    // 堆的当前大小,初始为 0

// 交换两个元素
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 插入元素
void insert(int x) {
    if (size >= MAX_SIZE) return; // 如果堆已满,直接返回

    H[size] = x; // 将新元素放在数组末尾
    int i = size;
    size++;

    // 上浮操作,调整堆
    while (i > 0 && H[(i - 1) / 2] > H[i]) {
        swap(&H[(i - 1) / 2], &H[i]); // 如果父节点大于当前节点,交换
        i = (i - 1) / 2; // 继续向上调整
    }
}

// 查找节点的索引
int findIndex(int x) {
    for (int i = 0; i < size; i++) {
        if (H[i] == x) return i; // 如果找到节点,返回其索引
    }
    return -1; // 未找到节点,返回 -1
}

// 判断命题:x 是否是根节点
bool isRoot(int x) {
    return H[0] == x; // 根节点是堆的第一个元素
}

// 判断命题:x 和 y 是否是兄弟节点
bool areSiblings(int x, int y) {
    int idxX = findIndex(x); // 找到 x 的索引
    int idxY = findIndex(y); // 找到 y 的索引
    if (idxX == -1 || idxY == -1) return false; // 如果任一节点未找到,返回 false
    return (idxX - 1) / 2 == (idxY - 1) / 2; // 检查它们的父节点是否相同
}



// 判断命题:x 是否是 y 的子节点
bool isChild(int x, int y) {
    int idxX = findIndex(x); // 找到 x 的索引
    if (idxX == -1) return false; // 如果 x 未找到,返回 false
    return H[(idxX - 1) / 2] == y; // 检查 x 的父节点是否为 y
}

int main() {
    int N, M;
    scanf("%d %d", &N, &M); // 读取插入元素的个数 N 和命题数 M

    // 插入元素
    for (int i = 0; i < N; i++) {
        int x;
        scanf("%d", &x); // 读取要插入的元素
        insert(x);       // 将元素插入堆
    }

    // 处理命题
    getchar(); // 消耗换行符,避免影响后续输入
    for (int i = 0; i < M; i++) {
        char prop[100];
        fgets(prop, sizeof(prop), stdin); // 读取整行输入(命题)

        if (strstr(prop, "is the root") != NULL) {
            // 如果命题是 "x is the root"
            int x;
            sscanf(prop, "%d", &x); // 提取 x 的值
            printf("%c\n", isRoot(x) ? 'T' : 'F'); // 判断并输出结果
        } else if (strstr(prop, "are siblings") != NULL) {
            // 如果命题是 "x and y are siblings"
            int x, y;
            sscanf(prop, "%d and %d", &x, &y); // 提取 x 和 y 的值
            printf("%c\n", areSiblings(x, y) ? 'T' : 'F'); // 判断并输出结果
        } else if (strstr(prop, "is the parent of") != NULL) {
            // 如果命题是 "x is the parent of y"
            int x, y;
            sscanf(prop, "%d is the parent of %d", &x, &y); // 提取 x 和 y 的值
            printf("%c\n", isParent(x, y) ? 'T' : 'F'); // 判断并输出结果
        } else if (strstr(prop, "is a child of") != NULL) {
            // 如果命题是 "x is a child of y"
            int x, y;
            sscanf(prop, "%d is a child of %d", &x, &y); // 提取 x 和 y 的值
            printf("%c\n", isChild(x, y) ? 'T' : 'F'); // 判断并输出结果
        }
    }

    return 0; // 程序正常结束
}

全部评论

相关推荐

#牛友故事会# 商界的事情,往往都是连续剧。距离华为300人团队进驻阿维塔(2025年2月23日)不满一个月,2025年3月13日传出消息,阿维塔计划最快于2025年下半年提交上市申请,拟募资约10亿美元(约72.33亿元人民币)。企业上市通常有两种背景,一种是赚得盆满钵满上市扩大规模,另一种是亏损放大急需外部输血。阿维塔,属于后者。阿维塔2022-2023年累计净亏损达78亿元(2022年-15亿元,2023年-93亿元),2024年1-8月净亏损进一步扩大至21.22亿元,再不上市,背后的投资者,肯定不乐意自己被长期放血。阿维塔的核心管理层,均是长安汽车高管——朱华荣:长安汽车董事长,2023年底亲自挂帅阿维塔科技董事长。陈卓:2024年2月接任总裁。此前任长安汽车品牌公关部总经理。他们也是阿维塔市场运作的核心人物。阿维塔早期成立(2018年)资方包括长安、蔚来,2021年蔚来退出,又引入了华为、宁德时代作为股东。2024年12月,阿维塔完成110亿元C轮融资,投资方包括长安汽车、渝富系基金、国投系基金等。阿维塔的融资规模可谓庞大。然而,新能源车企在国内的竞争极端激烈,各家不仅在低价位&nbsp;打得头破血流,高端车型也是一片红海,加上已有汽车新势力进入盈利阶段,阿维塔的路,可不是上市,就能变得容易走的。#牛客AI配图神器#
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务