zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
  • 相关阅读:
    自己实现简单Spring Ioc
    java中动态代理的实现
    Token以及签名signature的设计与实现
    Spring boot整合jsp
    spring boot+mybatis整合
    java并发基础(六)--- 活跃性、性能与可伸缩性
    java并发基础(五)--- 线程池的使用
    java并发基础(四)--- 取消与中断
    java并发基础(三)--- 任务执行
    java并发基础(二)
  • 原文地址:https://www.cnblogs.com/xyqxyq/p/12325262.html
Copyright © 2011-2022 走看看