一节平平无奇的双学位数据结构课,但是助教是金牌✌,而且完全放飞自我讲嗨了()
只能说有一种完全不顾非竞赛党死活的美(
这篇文章尝试记录一下金牌助教老师在课上讲到的东西,并且注明(个人认为)哪些对于这门课的日常做题/考试来说是useful的
省流版:
授课老师:我们今天安排了助教为大家介绍一些做题和EOJ使用的经验
助教:(开心地走上台)(打开教室电脑插入u盘)(一边下载dev一边吐槽这个软件年久失修但还是下载了)(开心地介绍常见名词缩写,尤其是AK!)(点出班里有acm佬的存在,为后文埋下伏笔)(吐槽算法竞赛的码风)(谴责使用stl的同学不够尊重这门课)(画风一变开始安利pbds)(青少年一定要学会的100个卡常小技巧.mp4)
(讲解文件重定向)(太好玩了,再讲讲编译原理吧!)(大家应该都知道……吧?)(好像不太对,要不重归一下正题吧)
(在ppt上公开处刑同学1的代码:混邪码风型)(公开处刑同学2的代码:面向gpt型)(公开处刑同学id)(开大)(开盒班里打acm的同学主页)(开盒真是太好玩了,越讲越开心)(回忆起了在队里负责数论的美好时光)(讲起了神奇数字和数论)(不会对拍的人将度过一个失败的人生!)
(不对,要不还是讲讲例题吧)(这道A+B真是太难了,我要告诉大家得用splay做)(这道链表题我有一个mlogn的平衡树做法,但是你们知识容量太小,我写不下)(展示高超的stl运用技巧)(啊好像要下课了)(你们还有什么要问吗)(开开心心地下台)(讲课(看同学代码/id/开盒)真是太好玩啦!)
额外的笑点解析1:笑到一半发现展示的混邪代码是自己写的(其实真的只是用了个三目运算符套赋值QAQ,lyl当年的码风比我抽象多了)
笑点解析2:id反映出的你班同学良好精神状态
可以看得出来是真心热爱ACM的巨佬了ヾ(≧▽≦*)o
一、 OJ上的常见评测结果以及原因
1. Accepted(满分!好耶!)
2. Wrong Answer(又称WA,答案错误)
遇到这种问题,你可以进行自查:
(1)简单看一眼程序,是不是有用来调试的输出语句没删
(2)认真再读一遍题,看看输入输出格式是不是和题目要求一模一样(尤其是输出的大小写、空格、符号),再确认一遍题意是不是理解错了
(3)检查是不是有该开long long
的地方没开(经典错误,尤其是你发现前面过了很多点,但是卡在了一个中间/偏后的数据时)
(4)检查数组开得够不够大(一般这个会报RE,偶尔也会有WA)
(5)循环中的i
,j
,k
是否都写对了,有没有反复使用i
(6)认真考虑各种特殊情况和边界问题(比如1既不是质数也不是合数、学二分的时候边界该不该取等)
(7)检查多测(有case1:
,case2:
这种)下每次运行程序最开始有没有清空数组
(8)再次自己想一些数据,在本地程序上试试会不会出错
有的时候老师会开放查看错误的具体数据是什么的权限,但还是建议先自己找找问题,毕竟考试的时候没有这个福利QAQ
3. Compile Error(编译错误)
一般会给到编译错误的具体提示,大概率是分号没打对、少些头文件之类的很好找的问题(助教提到了
4. Time limit exceeded(TLE,运行超时)
由于这个课程不会涉及很难的算法,所以我个人认为,在遇到这个问题时,你应该先考虑“我的程序实现得对不对”,再考虑“我的思路对不对”,尤其是在你发现第一个或者第二个测试点就没有通过的时候
最最常见的涉及“我的程序实现得对不对”的原因:你的程序跑了一个死循环,比如你的while()
括号中的条件恒为真(非常有可能是你想在后面的花括号里写一个递增递减语句,但是你忘了,为了避免这种情况建议在用while
的时候先把break
和递增递减的语句给写了),或者你写二分的时候没有考虑边界问题。
然后我还是稍微写一点关于程序运行时长的知识吧(这个陆幼利当年没有讲,吴老师和金牌助教都提了):
一般来说,程序主要是在计算的部分耗时,而其他的赋值、输入输出等,你可以先暂时认为它们不怎么耗时(但是输入输出量达到1e5这个层次的时候,就开始有区别了,后面会讲到)
举个例子:(两次循环)
我们可以认为,声明“ans”是不怎么耗时的,而ans += arr[i][j]需要被视作是一次耗时的“计算”操作(你可以只把加减乘除当作“计算”)
在这段代码中,两次循环使得这个“计算”操作被执行了m*n
次(在计算耗时的时候,你应该重点关注循环的次数)
那么,计算机可以执行多少次“操作”呢?什么情况下你的程序才会TLE?
在一道题目最开始,你会看到“单点时限”的字样,比如一道题限制是1s,也就是说,对于任何一组给定的数据(注意是单组,而不是所有数据),你的程序必须在1s内得到正确的结果
你可以认为,计算机每秒可以执行1e8-1e9
次“计算”操作(华师大OJ大概可以当成3e8
,偶尔也会有惊喜:)
这是一场新生赛中的一道题目,只要你不像一些只会用Python的飞舞一样自带3-5倍的语言常数,你就很可能在EOJ神机的加持下用模拟AC这道数据量足足有1e9的题(误
总结地说,在一道时限1s的题里你的程序最多只能执行3e8次的计算操作,如果次数再多,就很可能得到TLE的结果
5. Runtime Error(RE,运行错误)
一般的原因:scanf
没加&
,数组越界(比如你的数组长度是100,但是你访问了a[120]
),数组开得不够大或者太大,运算过程中除以或者模了0
6. Memory limit exceeded(MLE,内存超限)
绝大多数情况是因为你开了一个过于大的数组
一个快捷记忆方法:int
大小32bit或4字节,long long
大小64bit或8字节,一般一道题内存限制是256MB,相当于你最多可以开一个大约2e7的一维数组
7. Idleness limit exceeded
仅出现于交互题,你没有清除缓冲区
基本上EOJ的报错只有这些