将一系列给定数字顺序插入一个初始为空的小顶堆
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
。输入样例:
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
小寻梅就随便打的,可能在判断反面做的不是很好,不过还是希望能给大家一个帮助,如果大家有什么更好的方法,也可以跟小寻梅分享一下哦。
这道题其实并不难,就输入加判断,哈哈哈,不过难点好像也是输入和判断,小寻梅的做法是:观察,因为第一次输入的肯定是一个数字直接输入即可,然后在输入3个字符串,判断最后一个字符串的第一个元素,跟别可能为:'r','a','p','c',就这样了,直接看代码吧,60行而已,边看小寻梅的代码边想,发现并不难。嘿嘿嘿。
#include<stdio.h>
void swap(int a[],int i,int k){
int t=a[i];
a[i]=a[k];
a[k]=t;
}
void stack(int a[],int s){
for(int i=s/2;i>0;s=i,i/=2)
if(a[s]<a[i])
swap(a,s,i);
}
int find(int a[],int n,int m){
for(int l=1;l<=n;l++)
if(a[l]==m) return l;
return 0;
}
int main(){
int n,m,i,p,q;
scanf("%d %d",&n,&m);
int a[n+1];
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
stack(a,i);
}getchar();
while(m--){
char g[10],h[10],str[10];
scanf("%d %s %s %s",&p,g,h,str);
if(str[0]=='r'){
if(a[1]!=p) printf("F\n");
else printf("T\n");
}else if(str[0]=='a'){
scanf("%s",g);
sscanf(h,"%d",&q);
if(find(a,n,p)/2==find(a,n,q)/2)
printf("T\n");
else printf("F\n");
}else if(str[0]=='p'){
scanf("%s %d",g,&q);
if(find(a,n,p)==find(a,n,q)/2)
printf("T\n");
else printf("F\n");
}else if(str[0]=='c'){
scanf("%s %d",g,&q);
if(find(a,n,p)/2==find(a,n,q))
printf("T\n");
else printf("F\n");
}
}
return 0;
}