当前位置: 首页 > 工具软件 > 天梯 > 使用案例 >

天梯赛选拔1

姜学海
2023-12-01

通过这次天梯赛选拔也是给最近有点膨胀的自己一点点惊醒,自己的水平还远远不够,一些最基础的知识都还运用的很不好,甚至没有印象,这一点很不好。还有一个月的蓝桥杯就要到了,再这样下去想拿到一个好的名次是非常困难的,要开始查漏补缺和复习一些基础知识了。总结了七个需要复习和检讨的地方。

1.在第四题最后对结果去重时,使用set不会遍历元素了,想到了用迭代器,但是写的时候磕磕碰碰,最后并没有全部AC。重新复习一下set的基本用法。(好像不对,因为set是有序的(大小),而题目最后输出时不能改变顺序)

1).set只能通过迭代器遍历,即遍历set集合前需要定义一个迭代器:set<type>:iterator it;然后使用*it去访问set中的元素

//循环输出set集合中的元素
for(set<int>::iterator it=s.begin();it!=s.end();it++)
{
	cout<<*it<<endl;
}

2).插入元素,st.insert(x)

         删除元素,st.erase(x)

         查找(计数)元素,st.count(x)

2.输出小数点后2位

之前很少考虑这个问题,因为在力扣上刷题养成了直接输出的习惯,这样很不好,而且输出只会用printf,然后里面的参数有些弄混淆了,printf("%.2lf",x)输出浮点数x的小数点后2位,是在想了很久之后才用的,然后很惊险的过了一道题,在发红包的那道题,既要输出浮点数还要自定义排序(并且自定义排序也出问题了,后面详细讲)卡住了。并且使用printf时偷懒使用了万能头文件,因为不太记得要使用#include<cstdio>了。在书上看的时候也没用记得太牢。

1)使用setprecision()函数,且需要包含#include<iomainp>头文件

#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    float a = 0.20001;
    cout.setf(ios::fixed);
    cout << "a=" <<fixed<< setprecision(2) << a <<endl; //输出结果为a=0.20
    cout.unsetf(ios::fixed);
    cout << "a=" << setprecision(2) << a <<endl; //输出结果为a=0.2
    return 0;
}

2)使用printf()自带函数,且需要包含#include<cstdio>头文件         

3.输入时数据有0

在做关于时间的题目的时候,遇到输入数据07:05,很自然的就定义了两个整型来输入,然后输出的时候发现输出的是07:00,就一直很纳闷难道是5没有读入吗,于是又定义了一个整形来接受,发现还是没有读入,最后才发现是这个特殊字符‘:’也是需要读入的,最后也只拿了7分,格式错误,再看一下(晕,中间少了一个‘ ’.不应该。

4.cmp排序

发红包这道题还是卡住了,但是现在的思路是用pair存入序号和对应的值然后sort,cmp排序没有问题了,但是对数组的操作和一些细节卡住了还要再操作一下。

(发现可以放入大根堆<pair<int,int>>中,自动就排序了然后遍历即可)

5.并查集

对第十题的思路,一开始是简单的染色,对朋友染成正数(递增),敌人标为负数(递减),这样只需判断是否相等就知道对应的关系了,但是忽视了朋友的朋友是朋友这一句话,所有这个逻辑是不成立的。后来的思路是使用并查集,将朋友和朋友的朋友都放入一个集合,再遍历时逐个输出。但是并查集的构造好像出问题了,现在复习一下。

int find(int x)        //查询是否是同一个集合
{
    if(x==fa[x]) return x;
    return fa[x]=find(fa[x]);
}

void join(int c1.int c2)   //合并两个集合
{
    int f1=find(c1),f2=find(c2);
    if(f1!=f2) fa[f1]=f2;
}

6.二叉树

在力扣上刷题习惯直接用TreeNode了,没有定义结构体的习惯了;

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */

第十题是通过前序和中序遍历,重构二叉树,然后镜像翻转(非叶子节点左右孩子对换),再 层序遍历二叉树。在力扣上有类似的题目,掌握程度还不够。每次通过前序遍历找到根节点,再根据根节点将中序遍历分割为左、右部分,前序遍历也分割为左、右部分,再递归调用分割函数,构造二叉树。再运用队列,层序遍历二叉树即可。

7.堆

//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;

//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

基础类型默认为大根堆
//对于pair来说,先比较第一个再比较第二个

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main() 
{
    priority_queue<pair<int, int> > a;
    pair<int, int> b(1, 2);
    pair<int, int> c(1, 3);
    pair<int, int> d(2, 5);
    a.push(d);
    a.push(c);
    a.push(b);
    while (!a.empty()) 
    {
        cout << a.top().first << ' ' << a.top().second << '\n';
        a.pop();
    }
}


 

 类似资料: