当前位置: 首页 > news >正文

【天梯赛】L2-012(实战反思代码实现)

L2-012 关于堆的判断 - 团体程序设计天梯赛-练习集

实战反思

// 建立小顶堆的过程:接收一个,就插入一个

for (int i = 1; i <= N;i++){//建立小顶堆:记住,边插边建!
		cin >> vec[i];
		int k=i;
		while(k>1 && vec[k]<vec[k/2]){
			swap(vec[k],vec[k/2]);
			k/=2;
		}
    }

//int idx = str.find(to_find, start)

注意:是从start开始向后查找,且包含start位置本身!

//ps: rfind(tofind, start)函数是从是从start开始向前查找,且同样包含start位置本身!

注意:没有找到返回-1,但是if(-1)会被判断为true,所以应该用if(str.find(to_find) == -1)表示查找失败

//字符串转整数:stoi(str)

//误:兄弟节点的判断:兄弟 != 存储位置差为一,后者有可能并非同属于一个父亲

对于完全二叉树,用 idx1 / 2 == idx2 / 2来判断

代码实现

#include<bits/stdc++.h>
using namespace std;
//重复数字?
int find_idx(int val, vector<int>vec)
{
    for(int i=1; i<vec.size(); i++) if(vec[i] == val) return i;
}

int main()
{
    int N, M;
    cin>>N>>M;
    vector<int>vec(N+1);
    for (int i = 1; i <= N;i++){//建立小顶堆:记住,边插边建!
		cin >> vec[i];
		int k=i;
		while(k>1 && vec[k]<vec[k/2]){
			swap(vec[k],vec[k/2]);
			k/=2;
		}
    }
    string str;
    getline(cin, str);
    for(int i=0; i<M; i++)
    {
        getline(cin, str);
        int idx = str.find(' ');//利用空格号确定语句中数字的位置
        string str_num = str.substr(0, idx);//误!作用:从起始位置开始提取idx个字符!
        int num1 = stoi(str_num);
        int idx1 = find_idx(num1, vec);
        if(str.find("root") != -1)//误!没找到返回-1,所以if(str.find("root"))在没找到时为true
        {
            if(idx1 == 1) cout<<"T"<<endl;
            else cout<<"F"<<endl;
            continue;
        }
        else if(str.find("siblings") != -1)
        {
            int lf = str.find(' ', idx+1);
            int rt = str.find(' ', lf+1);//误!从查找位开始,但包含查找位!
            str_num = str.substr(lf+1, rt-1-lf);
            int num2 = stoi(str_num);//stoi函数不熟!
            int idx2 = find_idx(num2, vec);
            if(idx1 / 2 == idx2 / 2) cout<<"T"<<endl;//兄弟节点不等价于相邻存储!相邻的不一定有同一个father!
            else cout<<"F"<<endl;
            continue;
        }
        int lf = str.rfind(' ');//从该位置开始 向前 查找!
        str_num = str.substr(lf+1, str.length()-1-lf);
        int num2 = stoi(str_num);
        if(str.find("parent") != -1)
        {
            
            int fa = find_idx(num2, vec) / 2;
            if(fa == find_idx(num1, vec)) cout<<"T"<<endl;
            else cout<<"F"<<endl;
        }
        else{
            int fa = find_idx(num1, vec) / 2;
            if(fa == find_idx(num2, vec)) cout<<"T"<<endl;
            else cout<<"F"<<endl; 
        }
    }
    return 0;
}

相关文章:

  • 压测工具开发(一)——使用Qt Designer构建简单界面
  • Java编程思想:为何有时要将子类对象赋值给父类引用
  • 六级备考 词汇量积累(day11)
  • DNS域名解析服务
  • 【区块链安全 | 第一篇】密码学原理
  • C++初阶入门基础二——类和对象(中)
  • 避免踩坑!查收查引常见问题解答
  • C语言动态内存管理深度解析与嵌入式开发实战
  • 12_JavaScript_实现日期
  • dfs(深度优先)——太抽象了
  • 【新能源汽车实验室设备控制:PLC与单片机选型指南(深度解析+实战案例)】
  • AI数字人直播系统
  • java中的枚举类型和c,c++的有区别吗?c,c++的枚举,结构体,联合体,三种数据有什么区别和联系
  • 基于DrissionPage的TB商品信息采集与可视化分析
  • 《大语言模型》学习笔记(四)--Transformer 模型
  • 数据库 第一章 MySql基础(1)
  • Thales靶机渗透攻略
  • 蓝桥杯备考----> Apple Catching G(线性DP)
  • 01LinePlot
  • 【蓝桥杯速成】| 12.回溯排列N皇后
  • 爬坡难下坡险,居民出行难题如何解?
  • 李强:把做强国内大循环作为推动经济行稳致远的战略之举
  • 张汝伦:康德和种族主义
  • 美将解除对叙利亚制裁,外交部:中方一贯反对非法单边制裁
  • “异常”只停留在医院里,用艺术为“泡泡宝贝”加油
  • 习近平出席中拉论坛第四届部长级会议开幕式并发表主旨讲话