码迷,mamicode.com
首页 > 其他好文 > 详细

7-12 关于堆的判断

时间:2020-02-18 11:28:32      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:goto   lin   vector   oid   break   std   ==   EAP   using   

思路

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

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

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

代码

#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 关于堆的判断

标签:goto   lin   vector   oid   break   std   ==   EAP   using   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!