PTA 团体天梯 关于堆的判断

一早起来复盘了昨天做的堆,还算不错的,昨天GIS大赛公布结果了,虽然没有拿奖,也难免小小的失落,但是荣辱不惊就是最棒的~!

接下来上代码和注释。
这题就是考堆的基本知识吧,感觉放在12题也还好的哄。

原题:
在这里插入图片描述
在这里插入图片描述

小顶堆:每个结点的值都小于或等于其左右孩子结点的值
(下面的图是我复制别人的)

堆是完全二叉树
在这里插入图片描述

左移运算符
在这里插入图片描述

上代码,注释极其详细易懂

#include<iostream>
using namespace std;
#define maxn 10010
int heap[10010];
int n;//插入元素个数

//建堆 
void push(int x)
{
 int tmp,flag=0;
 while(x!=1&&!flag)//x不能等于1, 
 {
  if(heap[x>>1]>heap[x])//要建小顶堆,根结点的值不能比左右结点大 
  {
   tmp=heap[x];
   heap[x]=heap[x>>1];
   heap[x>>1]=tmp; 
  }
  else
  flag=1;//老顺利了,因为之前的都是这么比过来的,所以要是这一关根结点没有比它大了就不用比了 
  x>>=1; //如果成功换了位子,那么就要代替被替代的那个家伙的位置继续比下去
  ///这是堆的精髓 
  } 
}



int father(int x)
{
 int i;
 for(i=1;i<=n;i++)
 {
  if(heap[i]==x)
  break;
 }
 return heap[i>>1];
}


int main()
{
 int m;
 cin>>n>>m;
 for(int i=1;i<=n;i++) 
 {
  cin>>heap[i];
  //新的结点进来了就要进行排序 
  push(i); 
 }
 
 int x,y;
 char s[10];
 while(m--)
 {
  scanf("%d%s",&x,s);
     if(s[0]=='a')
     {
   scanf("%d%s",&y,s);
   scanf("%s",s);
   printf(father(x)==father(y)?"T\n":"F\n");
     }
     else
     {
      scanf("%s",s);
      if(s[0]=='a')
      {
       scanf("%s",s);
       scanf("%s%d",s,&y);
       printf(father(x)==y?"T\n":"F\n");
   }
   else
   {
    scanf("%s",s);
    if(s[0]=='r')
    {
     printf(heap[1]==x?"T\n":"F\n");
    }
    else
    {
     scanf("%s%d",s,&y);
     printf(x==father(y)?"T\n":"F\n");
     
    }
   }
  
     }
 }

  return 0;

}

以上就是全部。
总结几点:

  1. 堆的精髓是孩子索引除以2就等于父亲
  2. 建堆的时候,如果两个结点的位置交换了,那么被交换的结点还应于新的父亲作比较,如果第一次就顺利了就不用比较了。
  3. 索引为1的不可以再判断,因为1已经找不到父结点跟它做比较了,左移一位会错乱。
  4. scanf输入字符串,不接受空格

over。
这次放的图是我在南京东路拍的,很有霓虹的感觉,这周六要去欢乐谷过万圣节了,这两天要好好努力~yy加油 ~

本文转载自:
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_42576687/article/details/88904232

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值