当前位置: 首页 > 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;
}

http://www.dtcms.com/a/89349.html

相关文章:

  • 压测工具开发(一)——使用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皇后
  • leetcode day30 134+135+860
  • 深挖增长内核:好产品驱动增长的全方位解析
  • 深度解析:TOML、XML、YAML及其他配置/数据格式对比
  • 用YoloV8训练一个图片检测的模型,我接下来要做哪些事
  • 《深入Linux内核架构》读书笔记--第三章 内存管理
  • 【含文档+PPT+源码】基于Python的全国景区数据分析以及可视化实现
  • 【例3.5】位数问题(信息学奥赛一本通-1313)
  • BertTokenizer.from_pretrained的讲解和使用
  • golang编写UT:applyFunc和applyMethod区别
  • Oracle数据库服务器地址变更与监听配置修改完整指南