7-12 关于堆的判断

Posted xyqxyq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于7-12 关于堆的判断的主要内容,如果未能解决你的问题,请参考以下文章

关于堆的判断

PTA L2-4 关于堆的判断

关于堆的判断

关于堆的判断

L2-012. 关于堆的判断(STL中heap)

L2-012. 关于堆的判断