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。

输入样例:
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<bits/stdc++.h>
using namespace std;

const int N=1086;
int siz,m;
int h[N];
string s;

void down(int x){
    
    
	int u=x;
	if(u*2<=siz&&h[u*2]<h[x]) x=u*2;
	if(u*2+1<=siz&&h[u*2+1]<h[x]) x=u*2+1;
	if(u!=x){
    
    
		swap(h[u],h[x]);
	}
}

void up(int x){
    
    
	while(x/2&&h[x/2]>h[x]) swap(h[x],h[x/2]),x/=2;
}

int check(){
    
    
	if(s[1]=='a') return 2;//兄弟 
	if(s[4]=='t') return 3;//父节点 
	if(s[4]=='a') return 4; //子节点 
}
int main(){
    
    
	cin>>siz>>m;
	for(int i=1;i<=siz;i++) cin>>h[i],up(i);
	//for(int i=siz/2;i;i--) down(i);
	while(m--){
    
    
		int x;
		s="";
		cin>>x;
		getline(cin,s);
		bool A=0;
		if(s.compare(" is the root")==0){
    
    
			if(h[1]==x) cout<<"T"<<endl;
			else cout<<"F"<<endl;
			continue;
		}
		
		int k=check();
		int num=0,j;
		if(k==2){
    
    
			for(int i=5;i<s.size();i++){
    
    
				if(s[i]>='0'&&s[i]<='9')
				  num=num*10+s[i]-'0';
				else 
                    if(i!=5) break;
			}
			if(s[5]=='-') num*=(-1);
			for(int i=1;i<=siz;i++)
			  if(num==h[i]){
    
    
			  	j=i;break;
			  }
			if(j%2) j--;
			else j++;
			if(h[j]==x) A=1;
		}else if(k==3){
    
    
			for(int i=18;i<s.size();i++){
    
    
				if(s[i]>='0'&&s[i]<='9')
				  num=num*10+s[i]-'0';
			}
			if(s[18]=='-') num*=(-1);
			//cout<<num<<endl;
			for(int i=1;i<=siz;i++)
			  if(num==h[i]){
    
    
			  	j=i;break;
			  }
			if(h[j/2]==x) A=1;
		}else{
    
    
			for(int i=15;i<s.size();i++){
    
    
				if(s[i]>='0'&&s[i]<='9')
				  num=num*10+s[i]-'0';
			}
            //cout<<num<<endl;
			if(s[15]=='-') num*=(-1);
			//cout<<num<<endl;
			for(int i=1;i<=siz;i++)
			  if(num==h[i]){
    
    
			  	j=i;break;
			  }
			if(h[j*2]==x||h[j*2+1]==x) A=1;
		}
		
		if(A) cout<<"T";
		else cout<<"F";
		cout<<endl;
		
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/jigsaw_zyx/article/details/123266771