• 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;
    }
    
    
  • 相关阅读:
    chrome浏览页面常用快捷键 && 常见的HTTP状态码
    hasCode详解
    队例初始化问题(Queue)
    新手问题--双链表最后一个节点无法删除问题
    高级排序--快速排序
    高级排序--归并排序
    高级排序--希尔排序
    简单排序--插入排序
    简单排序--选择排序
    简单排序--冒泡排序
  • 原文地址:https://www.cnblogs.com/xyqxyq/p/12325262.html
Copyright © 2020-2023  润新知