【TAC】第一周

TAC终于过去第一周了,至少在课程和习题意义上来说如此。

怎么说呢,颇费了一些时间和精力吧,有苦有甜,很遗憾没能全AC过去,最终还是败在了那道最小(大)生成树上,尽管它只是一个简单的并查集而已。

但说实话,并查集在三个月前看姥姥和黑皮书时,也没有十分走心吧。现在唯一能得出的结论就是,光听课看书抄笔记是完全没用的,必须亲手实现才能留下一点点的印象。

哎,看过的东西又尘归尘土归土了。

但也不是完全一点印象也没有的,比如还记得父节点表示法。

其他的,还多亏有了代码模板和提示,以及充分的讨论,才能顺利理解题意给AC掉。说来也很不是滋味,毕竟用了人家的东西,无论是思想上还是代码上,都不算完全是自己的东西。这样一来从写作变成了完形填空,难度降低了好几个档。也许从零写起的话,恐怕会花更多的时间和精力,也无法达到现在这种情况吧。光是输入输出就能够我喝一大壶的。

另外本以为这门课零基础的小白也可以听懂,实际上才发现人家是默认你很熟悉C++和基本数据结构和算法的……C++不会,数据结构学的很水,完全不会算法,码量太少的我一下子就无处遁形了。现在能想到的办法只有死磕,也唯有死磕,才能熬出一片天地来。C++不会,就只好看参考手册和示例现学现卖,涉及到的数据结构,就回头翻书翻笔记再重温课程。具体实现不会的,好多问多探讨。然后实在做不出也只好听习题课老师的讲解了。当然最重要的是吸收内化,就少不了之后的总结归纳。希望还能有精力尝试全凭自己从零写完。

现在还是太菜了,但这正是努力变强最有力的理由。

废话就扯到这,现在就做个阶段小结吧。

【习题1.1】 栈

描述
实现一个栈,完成以下功能:

入栈
出栈
询问栈中位置Y是谁
一开始栈为空。栈中的位置从1开始(即栈底位置为1)。

输入
第一行一个整数n,表示操作个数。

接下来n行,每行第一个数字表示操作(见描述):

若为数字1,则接下来有一串字符串X,表示将X压入栈中。
若为数字2,表示弹出栈顶(保证栈非空),并输出出栈的这个人。
若为数字3,则接下来有一个整数Y,表示询问栈中位置Y是谁(保证位置Y合法),并输出名字。
输出
将所有操作2和操作3输出,一行一个。

输入样例
11
1 a
1 b
1 c
3 1
3 2
3 3
2
1 d
3 1
3 2
3 3
输出样例
a
b
c
c
a
b
d
限制
对于30%的数据,1 ≤ n ≤ 2000;

对于另30%的数据,没有操作3;

对于100%的数据,1 ≤ n ≤ 100000。

数据中出现的字符串只包含26个小写字母(无空格等分隔符),且长度不超过15。

字符串有可能重复。正如现实中可能有重名一样。

时间:1 sec

空间:256 MB

提示
[入栈和出栈都是操作着栈顶。]

[开一个大小为n的数组,记录栈顶的位置,入栈出栈就是将这栈顶加一减一,栈中某个位置Y在数组相应的下标就是Y。]

代码实现:https://paste.ubuntu.com/p/CxVg2kRk6b/

【总结】

这就是最基本数据结构 栈 的简单实现,没什么好说的。当时还有些窃喜,以为之后也会是这种程度。现在想想真是太傻了,如果真的只是这种程度,那这钱可真是白花了。

【习题1.2】 队列

描述
实现一个队列,完成以下功能:

入列
出列
询问队列中位置Y是谁
一开始队列为空。队列中的位置从1开始(即队头位置为1)。

输入
第一行一个整数n,表示操作个数。

接下来n行,每行第一个数字表示操作(见描述):

若为数字1,则接下来有一串字符串X,表示将X加入队列。
若为数字2,表示出列(保证队列非空),并输出出列的这个人。
若为数字3,则接下来有一个整数Y,表示询问队列中位置Y是谁(保证位置Y合法),并输出名字。
输出
将所有操作2和操作3输出,一行一个。

输入样例
11
1 a
1 b
1 c
3 1
3 2
3 3
2
1 d
3 1
3 2
3 3
输出样例
a
b
c
a
b
c
d
限制
对于30%的数据,1 ≤ n ≤ 2000;

对于另30%的数据,没有操作3;

对于100%的数据,1 ≤ n ≤ 100000。

数据中出现的字符串只包含26个小写字母(无空格等分隔符),且长度不超过15。

字符串有可能重复。正如现实中可能有重名一样。

时间:1 sec

空间:256 MB

提示
[队头出列,队尾入列。]

[开一个大小为n的数组,记录队头和队尾的位置,入列出列就是将这两个位置改变一下,队列中某个位置Y在数组相应的下标为队头的位置+Y-1。]

代码实现:https://paste.ubuntu.com/p/7sHDMxPWvs/

【总结】

同样也是最基本数据结构 队列 的实现,甚至都不是循环队列。

【习题1.3】二叉树

描述
给定一个1到n的排列,按顺序依次插入到一棵二叉排序树(即二叉搜索树)中,请你将这棵二叉树前序遍历和后序遍历输出。

输入
第一行一个整数n。

接下来一行表示为n个整数,代表1到n的一个排列。

输出
输出所建成的二叉树的前序遍历和后序遍历。

输入样例
10
2 6 9 3 5 7 10 8 4 1
输出样例
2 1 6 3 5 4 9 7 8 10
1 4 5 3 8 7 10 9 6 2
限制
对于50%的数据,1 ≤ n ≤ 100;

对于100%的数据,1 ≤ n ≤ 100000。

保证建成的树的高度不超过50。

时间:1 sec

空间:256 MB

提示
[二叉树的操作基本都是递归操作,只要想想如何在一个节点上判断是朝着左孩子走还是朝着右孩子走就行了。]

代码实现: (自己的)https://paste.ubuntu.com/p/4GK4C5vT5z/ (别人的)https://paste.ubuntu.com/p/cK5v8m7Dhf/

【总结】

做到这里,就开始有些阻力了。讨论区和群里对这题的讨论也不少。

最开始没读懂题,后来发现题目和模板都有了改动,从二叉树改成了二叉搜索树。若非如此,只给出先序和后序是无法唯一确定一颗树的。

一开始写的版本,用的是模板给出的数组顺序存储方式。之前顺序存储只学过完全二叉树,即根下标为1,左孩子下标是父节点的二倍。但这个方法的致命缺点是空间浪费严重,不足以解决特别大的数据。结果也是如此,跑到后面几个测点就发生了段错误,显然是爆栈了。

后来没办法, 只好自己写个结构体,换成链式存储,简单回顾了一下何头的先序后序,然后轻松地AC了。

但是显然还是没看懂模板是怎么用顺序存储的…不知道如何解决左右孩子如何表示。后来看了别人的代码,才发现自己把顺序和链式的思想混为一谈了,实际上并没有那么麻烦,也没有当时就处理左右孩子的必要。而且这方法对数组空间的利用率非常高,真的是名副其实的“顺序”存储。

(未完待续……)

原文地址:https://www.cnblogs.com/lilinilil/p/9058543.html

时间: 2024-11-05 20:27:18

【TAC】第一周的相关文章

20145216 史婧瑶《信息安全系统设计基础》第一周学习总结

20145216 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 Linux基础 1.ls命令 ls或ls .显示是当前目录的内容,这里“.”就是参数,表示当前目录,是缺省的可以省略.我们可以用ls -a .显示当前目录中的所有内容,包括隐藏文件和目录.其中“-a” 就是选项,改变了显示的内容.如图所示: 2.man命令 man命令可以查看帮助文档,如 man man : 若在shell中输入 man+数字+命令/函数 即可以查到相关的命令和函数:若不加数字,那man命令默认从数字较

信息安全系统设计基础——第一周学习过程记录与总结体会

第一周学习过程记录与总结体会 第1节    Linux系统简介 1.Linux操作系统:即内核和系统调用两层 2.Linux与Windows的不同: (1)免费与收费 (2)软件与支持 (3)安全性 (4)使用习惯 (5)可定制性 (6)应用范畴 (7)各自缺乏的 3.如何学习Linux (1)明确态度,形成良好学习心态 (2)重视基础,从头学习 第2节  基本概念及操作 1.桌面环境介绍 通过内核—服务器(X.org) —客户端(X.client)实现完整的桌面环境,与Windows不同. 2

20155336 2016-2017-2《JAVA程序设计》第一周学习总结

# 20155336  2016-2017-2<JAVA程序设计>第1周学习总结 ## 教材学习内容总结 开学的第一周,带着些许的欣喜和好奇,听完了老师的第一堂课.说心里话学习JAVA仿佛观看一部英文影视作品一样头疼, 因为总会有许许多多相似的名字让你记得晕头转向.JAVA也是一样,什么JVM啊JRE啊JDK啊 (/(ㄒoㄒ)/~~)  等等一系列 的英文缩写,让人心神意乱~~但总体上对JAVA有了一个初步的了解.通过课上老师的介绍以及课下对JAVA书第一章的浏览, 我简单的了解了JAVA艰辛

第一周例行报告

PSP 内容 类别 预计时长 开始时间 结束时间 中断时间 实际花费时间 第一周作业一 写作 1h 2017-9-7  19:25 2017-9-7  20:18  回复微信消息5min 48min 看<构建之法> 阅读 一周,每天1h30min 2017-9-7  21:35 2017-9-10   每天抽空看一些 没有具体时间 采访记录 写作 1h 2017-9-9   20:46 2017-9-9 22:04  一边写一边吃火龙果  1h左右 构建之法读后感 写作 1h 2017-9-1

《嵌入式设计》第一周学习总结

<嵌入式设计>第一周学习总结 学习时遇到的主要问题 1.运行环境未及时安装 2.命令不熟练 3.上课状态不好 解决方法 1.及时安装环境并熟悉运行 2.参考Linux操作系统实用教程并百度一些问题的解决办法 3.及时调整自己状态 主要学习内容 Linux一些简单基本的操作, 用.c文件输出hello word 用vi test.c 创建.c文件 #include <stdio.h> int main(){ printf("hello word\n"); } 并用

20145311 《信息安全系统设计基础》第一周学习总结

20145311 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 常用的部分命令 CTRL+SHIFT+T:新建标签页,编程时有重要应用: ALT+数字N:终端中切换到第N个标签页,编程时有重要应用: Tab:终端中命令补全,当输入某个命令的开头的一部分后,按下Tab键就可以得到提示或者帮助完成: CTRL+C:中断程序运行 Ctrl+D:键盘输入结束或退出终端 Ctrl+S: 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+A: 将光标移至输入行头,相当于Home键 Ctrl+E

2016-7第一周工作总结

姓名 王奈 时间 第一周工作总结 学习内容 经过了一周的开发与改进,我们的easy工大已经初见成果.这一周,我们完成了:界面的重新设计,数据获取正确性修改,以及吐槽墙功能的实现等等.我的工作就是文档记录,在这过程中,我能够记录我们项目进步的点点滴滴,记录它是如何一步一步走到现在的样子,就像看到了软件的成长过程一样. 除此之外,我还完成了一个嵌入式开发项目的初步实现,学习了嵌入式编程的原则以及优化方法.如同软工所要求的一样,我在嵌入式开发的过程中也使用了文档记录的方法来管理我们的项目进度,这样一来

JS第一周总结1

JS第一周总结 这周我学习了JS的基础部分,大致分为了: a.基础变量及数据类型 b.特殊数据类型 c.JS基础语句类型 d.BOM操作 e.DOM操作 ###基础变量###     1.首先给变量取名,取名规范有3点:         1.变量首字符必须是字母或者美元符号$.下划线_ 三者之一.         2.变量名字中不能包括特殊符号,比如空格.加减号等符号.         3.变量中不能包括JS中的关键字,比如var之类的. 2.取好名字之后,我们需要将这个变量定义出来,并且赋值给

20145321曾子誉《Java程序设计》第一周学习总结

20145321 <Java程序设计>第1周学习总结 教材学习内容总结 第一章 1.三大平台:Java SE.Java EE .Java ME 2.Java SE:由JVM.JRE.JDK.Java语言四部分组成. JVM:操作系统,虚拟机. JRE:执行环境,包括JVM. JDK:包含JRE及开发过程中需要的一些工具程序. 3.JCP.JSR.RI.TCK的关系:任何想要提议加入Java的功能或特性,必须以JSR正式文件的方式提交,经过JCP这个国际组织投票通过,成为最终文件,由此做出的参考