L2-012 关于堆的判断 (25 分)(分类讨论)

简介: L2-012 关于堆的判断 (25 分)(分类讨论)

将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:


  • x is the root:x是根结点;
  • x and y are siblings:x和y是兄弟结点;
  • x is the parent of y:x是y的父结点;
  • x is a child of y:x是y的一个子结点。


输入格式:

每组测试第1行包含2个正整数N(≤ 1000)和M(≤ 20),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[−10000,10000]内的N个要被插入一个初始为空的小顶堆的整数。之后M行,每行给出一个命题。题目保证命题中的结点键值都是存在的。


输出格式:

对输入的每个命题,如果其为真,则在一行中输出T,否则输出F


输入样例:

1. 5 4
2. 46 23 26 24 10
3. 24 is the root
4. 26 and 23 are siblings
5. 46 is the parent of 23
6. 23 is a child of 10

结尾无空行


输出样例:

1. F
2. T
3. F
4. T

结尾无空行


思路:把堆存入数组之中,i的左孩子为2*i,右孩子为2*i+1,用x1来表示x的下标,用y1来表示y的下标,x是根结点等价于x==h[1],x和y是兄弟结点等价于和x和y具有相同的父节点,即:h[x1/2]==h[y1/2],x是y的父结点等价于h[x1]==h[y1/2],x是y的一个子结点等价于h[x1/2]==h[y1]

#include<iostream>
using namespace std;
const int N=1010;
int main()
{
    int n,h[N],m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>h[i];
    for(int i=1;i<=n;i++)//建立小根堆
    {
        int k=i;
        while(k>1&&h[k]<h[k/2])
        {
            swap(h[k],h[k/2]);
            k/=2;
        }
    }
    while(m--)
    {
        int x,y,x1,y1;
        string s1,s2,s3,s4;
        cin>>x>>s1;
        if(s1=="and")
        {
            cin>>y>>s2>>s3;
            for(int i=1;i<=n;i++)
            {
                if(h[i]==x) x1=i;
                if(h[i]==y) y1=i;//找到对应的下标
            }
            if(h[x1/2]==h[y1/2]) cout<<"T\n";
            else cout<<"F\n";
        }
        else
        {
            cin>>s2;
            if(s2=="a")
            {
                cin>>s3>>s4>>y;
                for(int i=1;i<=n;i++)
                {
                    if(h[i]==x) x1=i;
                    if(h[i]==y) y1=i;//找到对应的下标
                }
                if(h[x1/2]==h[y1]) cout<<"T\n";
                else cout<<"F\n";
            }
            else
            {
                cin>>s3;
                if(s3=="root")
                {
                    if(x==h[1]) cout<<"T\n";
                    else cout<<"F\n";
                }
                else
                {
                    cin>>s4>>y;
                    for(int i=1;i<=n;i++)
                    {
                        if(h[i]==x) x1=i;
                        if(h[i]==y) y1=i;//找到对应的下标
                    }
                    if(h[x1]==h[y1/2]) cout<<"T\n";
                    else cout<<"F\n";
                }
            }
        }
    }
    return 0;
}
目录
相关文章
|
7月前
【Leetcode 2645】构造有效字符串的最小插入数 —— 动态规划
状态定义:`d[i]`为将前 i 个字符拼凑成若干个 abc 所需要的最小插入数。状态转移方程: 如果` word[i]>word[i−1]`,那么`word[i]`可以和`word[i−1]`在同一组 abc 中,`d[i]=d[i−1]−1` ;否则`word[i]`单独存在于一组 abc 中,`d[i]=d[i−1]+2`
【剑指offer】-把数组排成最小的数-33/67
【剑指offer】-把数组排成最小的数-33/67
【LeetCode】1171. 从链表中删去总和值为零的连续节点、面试题 02.05. 链表求和
目录 1171. 从链表中删去总和值为零的连续节点 面试题 02.05. 链表求和
51 0
|
7月前
|
算法 测试技术 C#
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
|
7月前
|
存储
【每日一题Day276】LC2208将数组和减半的最少操作次数 | 贪心+大顶堆
【每日一题Day276】LC2208将数组和减半的最少操作次数 | 贪心+大顶堆
44 0
L2-012 关于堆的判断 (25 分)(小顶堆的模拟建立和关系判定)
L2-012 关于堆的判断 (25 分)(小顶堆的模拟建立和关系判定)
107 0
剑指offer_数组---把数组排成最小的数
剑指offer_数组---把数组排成最小的数
49 0
|
算法
算法|寻找不规律栈中最小元素
算法|寻找不规律栈中最小元素
73 0
剑指offer 46. 把数组排成最小的数
剑指offer 46. 把数组排成最小的数
77 0
[leetcode] 面试题 17.20. 连续中值 | 对顶堆维护动态中位数
[leetcode] 面试题 17.20. 连续中值 | 对顶堆维护动态中位数
103 0