题意:
将一系列给定数字顺序插入一个初始为空的小顶堆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;
}