7-12 关于堆的判断

思路

这题代码长,其实只是懒,没有把重复的代码写成函数。

只用建堆,循环判断就可以了。

循环判断是为了避免数的重复,判断每一中可能的情况是否为真。

代码

#include <bits/stdc++.h>
using namespace std;

const int maxn=1005;
vector<int> heap(maxn);

void siftUp(int i) {
	if (i==1) {
		return;
	}
	int flag=0;
	while (!flag&&i!=1) {
		if (heap[i]<heap[i/2]) {
			swap(heap[i],heap[i/2]);
		}
		else {
			flag=1;
		}
		i=i/2;
	}
}

int main()
{
	int n,m,tmp;
    cin>>n>>m;
	for (int i=1;i<=n;i++) {
		cin>>tmp;
		heap[i]=tmp;
		siftUp(i);
	}
	cin.get();
	while (m--) {
		string line;
		getline(cin,line);
		stringstream ss1(line);
		string str;
		int flag=0;
		while (ss1>>str) {
			if (str=="root") {
                flag=1;
			}
			else if (str=="siblings") {
                flag=2;
			}
			else if (str=="parent") {
                flag=3;
                break;
			}
			else if (str=="child") {
                flag=4;
                break;
			}
		}
        stringstream ss2(line);
        int num1,num2;
        if (flag==1){
            ss2>>num1;
            if (heap[1]==num1) {
                cout<<"T"<<endl;
            }
            else {
                cout<<"F"<<endl;
            }
        }
        else if (flag==2){
            ss2>>num1;
            ss2>>str;
            ss2>>num2;
            bool flag=false;
            for (int i=1;i<=n;i++) {
                if (heap[i]==num1) {
                    for (int j=1;j<=n;j++) {
                        if (heap[j]==num2) {
                            if (i!=j&&i/2==j/2) {
                                flag=true;
                                goto outloop;
                            }
                        }
                    }
                }
            }
            outloop:
            if (flag) {
                cout<<"T"<<endl;
            }
            else {
                cout<<"F"<<endl;
            }
        }
        else if (flag==3){
            ss2>>num1;
            for (int i=0;i<4;i++) {
                ss2>>str;
            }
            ss2>>num2;
            bool flag=false;
            for (int i=1;i<=n;i++){
                if (heap[i]==num1) {
                    for (int j=1;j<=n;j++) {
                        if (heap[j]==num2) {
                            if (j!=i&&j/2==i) {
                                flag=true;
                                goto outloop2;
                            }
                        }
                    }
                }
            }
            outloop2:
            if (flag) {
                cout<<"T"<<endl;
            }
            else {
                cout<<"F"<<endl;
            }
        }
        else if (flag==4) {
            ss2>>num1;
            for (int i=0;i<4;i++) {
                ss2>>str;
            }
            ss2>>num2;
            bool flag=false;
            for (int i=1;i<=n;i++){
                if (heap[i]==num1) {
                    for (int j=1;j<=n;j++) {
                        if (heap[j]==num2) {
                            if (j!=i&&j==i/2) {
                                flag=true;
                                goto outloop3;
                            }
                        }
                    }
                }
            }
            outloop3:
            if (flag) {
                cout<<"T"<<endl;
            }
            else {
                cout<<"F"<<endl;
            }
        }
	}

	return 0;
}

原文地址:https://www.cnblogs.com/xyqxyq/p/12325262.html