天梯赛训练:关于堆的判断

题意:

将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:
1、x is the root:x是根结点;
2、x and y are siblings:x和y是兄弟结点;
3、x is the parent of y:x是y的父结点;
4、x is a child of y:x是y的一个子结点。

输入格式:

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

输出格式:

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

输入样例:

5 4
46 23 26 24 10
24 is the root
26 and 23 are siblings
46 is the parent of 23
23 is a child of 10

输出样例:

F
T
F
T

代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int a[1100];
int n,m;
void built(int n,int x)//边加入边建堆
{
	int l=n;
	a[n]=x;
	while((l/2)>=1)
	{
		if(a[l]<a[l/2])//子节点和父节点的比较
		{
			int t;
			t=a[l];
			a[l]=a[l/2];
			a[l/2]=t;
		}
		l=l/2;
	}
}
int find(int x)//找下标
{
	int i;
	for(i=1; i<=n; i++)
		if(x==a[i])
			return i;
}
int main()
{
	int x;
	int i,j,k;
	scanf("%d%d",&n,&m);
	for(i=1; i<=n; i++)
	{
		scanf("%d",&x);
		built(i,x);
	}
	while(m--)
	{
		int s1;
		scanf("%d",&s1);
		char c1[20];
		scanf("%s",c1);
		int dc1=strlen(c1);
		if(dc1==3)//x and y are siblings:x和y是兄弟结点;
		{
			int ss1;
			scanf("%d",&ss1);
			char c2[20],c3[20];
			scanf("%s",c2);
			scanf("%s",c3);
			if(find(s1)/2==find(ss1)/2)//父节点相同,则为兄弟节点
				printf("T\n");
			else
				printf("F\n");
		}
		else//第一个单词是is
		{
			char cc1[20];
			scanf("%s",cc1);
			int dcc1=strlen(cc1);
			if(dcc1==1)//x is a child of y:x是y的一个子结点。
			{
				char cc2[20],cc3[20];
				scanf("%s",cc2);
				scanf("%s",cc3);
				int ss2;
				scanf("%d",&ss2);
				if(find(s1)/2==find(ss2))
					printf("T\n");
				else
					printf("F\n");
			}
			else//第二个单词是the
			{
				char ccc1[20];
				scanf("%s",ccc1);
				int dccc1=strlen(ccc1);
				if(dccc1==4)//x is the root:x是根结点;
				{
					if(find(s1)==1)
						printf("T\n");
					else
						printf("F\n");
				}
				else//x is the parent of y:x是y的父结点;
				{
					char ccc2[20];
					scanf("%s",ccc2);
					int ss3;
					scanf("%d",&ss3);
					if(find(ss3)/2==find(s1))
						printf("T\n");
					else
						printf("F\n");
				}
			}
		}
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值