zoukankan      html  css  js  c++  java
  • L2-012. 关于堆的判断 https://www.patest.cn/contests/gplt/L2-012

    看别人的题解  看了好久  就是不懂小顶堆是什么意思    朋友两句话就解决了

    看成一个完全二叉树   如果子节点大于父节点 那么就交换数值    

    zz  竟然就这么的简单   我看别人题解看了好久  还是一脸懵逼

    最后的输出没有标记 就直接输出了  看着麻烦  写起来简单

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<queue>
    #include<vector>
    #include<map>
    #include<math.h>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define LL long long
    #define N 10700
    int a[N];
    void q(int x)
    {
        if(x==1) return ;
        if(a[x]<a[x/2])
        {
            swap(a[x],a[x/2]);
            q(x/2);
        }
        return ;
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%d ",&a[i]);
            q(i);
        }
        while(m--)
        {
            char str[120];
            gets(str);
            int len=strlen(str);
            int ans=0,d=0,dd=0,w=0,falg=0;
            for(int i=0;i<len;i++)
            {
                if(w&&str[i]>='0'&&str[i]<='9')
                    d=d*10+str[i]-'0';
                if(!w&&str[i]>='0'&&str[i]<='9')
                    dd=dd*10+str[i]-'0';
                if(str[i]==' '||str[i]=='c')
                {
                    ans++;
                    w=1;
                }
                if(str[i]=='-'&&i>1&&str[i-1]==' ')
                    falg=1;
            }
            if(str[0]=='-') dd=-dd;
            if(falg==1) d=-d;
            int e,f;
            if(ans==3)
            {
                if(a[1]!=dd)
                    printf("F
    ");
                else printf("T
    ");
            }
            else if(ans==4)
            {
                for(int i=1;i<=n;i++)
                {
                    if(a[i]==d)
                        e=i;
                    if(a[i]==dd)
                        f=i;
                }
                if(abs(f-e)==1&&e/2==f/2)
                    printf("T
    ");
                else printf("F
    ");
            }
            else if(ans==5)
            {
                for(int i=1;i<=n;i++)
                {
                    if(a[i]==d)
                        e=i;
                }
                if(a[e/2]==dd)
                    printf("T
    ");
                else printf("F
    ");
            }
            else
            {
                for(int i=1;i<=n;i++)
                {
                    if(a[i]==dd)
                        e=i;
                }
                if(a[e/2]==d)
                    printf("T
    ");
                else printf("F
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    关于最大最小的k个数的类型题总结
    最小的K个数(剑指offer)
    215. Kth Largest Element in an Array(返回数组中第几大元素)(leetcode)
    数组中出现次数超过一半的数字(剑指offer)
    二叉搜索树与双向链表(剑指offer)
    第四届蓝桥杯c/c++B组6
    第四届蓝桥杯c/c++B组7
    第四届蓝桥杯c/c++B组8
    第四届蓝桥杯c/c++B组9
    第五届蓝桥杯 c/c++ B组8
  • 原文地址:https://www.cnblogs.com/a719525932/p/6604717.html
Copyright © 2011-2022 走看看