本周学习总结22.4.18-4.24:二叉树、搜索和排序

本周由于有两场面试、补三周共12课时的大物实验、智慧农业实验室二面qt程序开发学习,启航公司python培训以及校礼仪队训练还有剪辑人工智能和数学类专业招生视频,占用了特别多的学习时间,导致我敲代码的时间都集中在晚上十一点之后,并且由于早上还有早自习需要早起,所以真正能坐在电脑前敲代码的时间非常少了,所以本周我以看博客和资料和题目为主,也尽量多挤出时间来做题。平时在外面拿出琐碎时间读博客和资料。

上节课上课的时候学到了二叉树,还是比较好理解,但是在做题的时候,如何存储二叉树难住了我

P4715 【深基16.例1】淘汰赛 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这个题可以说是帮助我解决了存储二叉树的难题,这个题是1v1比赛求最终冠军的,双方比赛用到了二叉树,一场比赛的两个选手就是兄弟节点,最终的冠军是根节点,起初所有选手是叶子节点,此时存储二叉树的方式是:创建一个数组,第一个存储根节点,第二第三个存储根节点的两个孩子节点,直至到数组最后存储叶子节点为止。然后从叶子节点开始比赛,赢者存入父亲节点,直至根节点被填上为止,此过程用递归函数便能实现。

#include<iostream>
#include<cmath>
using namespace std;
int a[100000000],n,num,win[100];
void dfs(int x){
    if(x>=num)return;
    else{
        dfs(2*x);
        dfs(2*x+1);
        int left=a[2*x],right=a[2*x+1];
        if(left>right){
            win[x]=win[2*x];
            a[x]=left;
        }else{
            win[x]=win[2*x+1];
            a[x]=right;
        }
    }
}
int main(){
    cin>>n;
    num=pow(2,n);
    for(int i=0;i<num;i++){
        cin>>a[i+num];
        win[i+num]=i+1;
    }
    dfs(1);
    if(a[2]>a[3])cout<<win[3];
    else cout<<win[2];
}

You are given a grid with nn rows and mm columns. Rows and columns are numbered from 11 to nn, and from 11 to mm. The intersection of the aa-th row and bb-th column is denoted by (a,b)(a,b).

Initially, you are standing in the top left corner (1,1)(1,1). Your goal is to reach the bottom right corner (n,m)(n,m).

You can move in four directions from (a,b)(a,b): up to (a−1,b)(a−1,b), down to (a+1,b)(a+1,b), left to (a,b−1)(a,b−1) or right to (a,b+1)(a,b+1).

You cannot move in the same direction in two consecutive moves, and you cannot leave the grid. What is the minimum number of moves to reach (n,m)(n,m)?

给你一个n行m列的网格。行和列的编号从1到n,从1到m。第a行和第b列的交集记为(a,b)。

最初,你站在左上角(1,1)。你的目标是到达右下角(n,m)

您可以从(a,b)四个方向移动:上至(a−1,b),下至(a+1,b),左至(a,b−1)或右至(a,b+1)。

你不能连续两次朝同一个方向移动,也不能离开网格。到达(n,m)的最小步数是多少?

 这是在codeforces上遇到的一道题,这个题也难住我很长时间让我没有思路做,然后我在草稿纸上画了几个表格,发现只要沿着对角线走到边之后,沿着边走就能得到最小步数,也就是先往右,在往上,再往下就到了右边的一格,具体实现如下:

#include<iostream>
#include<cmath>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    for(int k=1;k<=t;k++){
        int n,m,num=0;
        cin>>n>>m;
        if((n==1&&m>2)||(m==1&&n>2)){
            cout<<"-1"<<endl;
            continue;
        }
        if(n==1&&m==1){
            cout<<0<<endl;
            continue;
        }
        if(m>=n){
            num+=2*n-1;
        }else{
            num+=2*m-1;
        }
        int abc=abs(m-n);
        if(abc%2==0){
            num+=3*(abc/2)+abc/2;
        }else{
            num+=3*(abc/2)+abc/2+1;
        }
        cout<<num-1<<endl;
    }
}

对于比赛,这么多次比赛了,我发现了自己的几个缺点,一个是找到思路太慢,每次读题都要读好长时间,而且由于我是日语生不会英语,需要借助翻译软件,有时翻译软件翻译的不准确影响了读题思路,每次同学都做出第一题了我才刚读完题;还有就是敲代码时总会出现一些小错误,比如说main后面忘了加(),这个低级错误就出现在了上次比赛的C题中,导致浪费了最少20分种的时间,最终就差几分钟就能ac掉呢个题;第三点就是精力问题,可能比赛前一个小时大脑还能满负荷运行,到了后面之后大脑就开始转不动了,有时一个很简单的算法都要构思好长时间,精力不足也是影响比赛的一大原因。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩Scott

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值