洛谷日报第86期]NOIP选手必知的编程技巧本文将给列位先容极少无论是通常陶冶或者加入逐鹿时都对照有效的编程方法,它们可能让咱们的标准可读性更强,便当咱们的调试,有些方法乃至可能助助咱们得回更众的分数。
有的工夫,咱们构制了一种新的数据类型(高精度数,矩阵),当然可能将数据类型的运算操功用函数的办法写出来。但采用重载运算符的体例,可能让标准更为自然。
正在组织体内部重载运算符时,括号内的参数会少一个(底细上,别的一个参数是this指针,即指向现在参数的指针(这个不首要啦,你只必要知晓就好)),也即是说,两元运算符只必要1个参数。(正在组织体外部界说时,两元运算符仍是必要2个参数)
正在C++标准中,咱们往往会加上using namespace std;这一行语句,那么它是干嘛的呢?
底细上,C++引入了一个叫做名字空间(namespace)的机制。引入这个机制的目标,是为理会决标准中变量/函数名反复的题目。
举个栗子:我写了一个solve()函数,别的一个体也写了一个solve()函数,假若把这两个函数放正在一个标准内中,就会展示函数重名的题目。这时,我可能把我的solve()函数放正在namespace code1中,把别的一个体的solve()放正在namespace code2当中,然后,通过code1::solve();语句就可能移用我写的solve()函数,code2::solve()可能移用别的一个体的solve()函数。
底细上,C++规范库把全豹的函数都放正在了namespace std当中,因此咱们移用这些函数的工夫,该当采用std::xxx的办法来移用规范库中的函数。当然,正在参加using namespace std;一行后,就可能省略std::了,咱们就可能偷懒了。(原来using namespace std;正在工程上不推选运用,但列位OIer们通常运用也没有什么题目)
当然,咱们正在逐鹿的工夫,可能通过运用namespace来使咱们的标准组织尤其规整。对照常睹的用法即是针对每个子工作(诸如上面的屠龙勇士),各写一个namespace,正在个中界说咱们处分该子工作所必要的变量与函数,云云各个子工作间互不扰乱,便当了咱们这些蒟蒻们骗分,也低重了正解爆炸的分数吃亏。(对待那些AK IOI的巨佬们,这句话当我这个蒟蒻没说)
咱们正在当地测试的工夫,往往要参加极少调试语句。要提交到OJ的工夫,就要把他们统统删除,有些烦杂。
#ifdef会搜检标准中是否有通过#define界说的对应标识符,假若有界说,就会推行下面的实质,#ifndef恰好相反,会正在没有界说相应标识符的状况下推行后面的语句。
当然,咱们也可能不正在标准中界说标识符,而是通过-DDEBUG的编译选项正在编译的工夫界说DEBUG标识符。云云就可能正在提交的工夫无须窜改标准了。
有的工夫咱们写了一份代码,然而不知晓它是不是确切的。这工夫就可能用对拍的手腕来举办查验或调试。
什么是对拍呢?的确而言,即是通过比拟两个标准的输出来查验标准具体切性。你可能将本身标准的输出与其他标准(打的暴力或者其他dalao的标程)的输出举办比拟,从而判别本身的标准是否确切。
当然,咱们不行本身比对两段标准的输出,因此咱们必要通过批治理的手腕来告终对拍的自愿化。
每次运转一次数据天生器,将天生的数据写入输入文献,通过重定向的手腕使两个标准读入数据,并将输出写入指定文献,诈欺Windows下的fc号令比对文献(Linux下为diff号令),从而查验标准具体切性。
正在运用rand()前,别忘了移用srand(time(NULL))来重置随机数种子。(不重置的话,每次移用rand()只会获得一套随机数)
rand()的天生随机数限度正在Windows下为 [0,32767] ,正在Linux下为 [0,2^{31}-1] ,因此假若数据过大,最好手写一个随机数天生器。(合于随机数天生器,可能睹一位dalao正在CF上的著作)。
-Wall:显示全豹警备音讯。当咱们的标准展示极少逻辑或语义上的题目时(包含未运用的变量,逻辑运算符的优先级题目,嵌套if语句的else配对题目),开启这个编译选项会显示这些警备音讯,云云就可能减轻咱们的调试担负。
-Ox:优化选项。普通能睹到的优化选项有-O1 -O2 -O3三种,其顶用的最众(公共半逐鹿(包含NOI)都邑开启,但NOIP没有)的优化选项是-O2。掀开优化选项有时(更加正在运用STL时)能裁汰标准运转韶华,但会给单措施试带来极少烦杂,有的工夫也会展示负优化。(预防:正在标准中参加#pragma GCC optimize(2)并不会正在NOIP评测时开启优化)
-DDEBUG:这个正在讲到用标识符举办调试的工夫先容过,是正在编译阶段界说DEBUG标识符,当然这里界说的标识符也可能更换为其他的标识符,比如-DTEST会正在编译阶段界说TEST标识符。
记得往往按Ctrl+S保管一下标准!(提到这一点是由于我市客岁普及组的工夫科场忽然停电,不少人没有保管的标准霎时灰飞烟灭,再有些人存盘的身分错误,重启的工夫标准也没了)
别忘了算内存,有也许你不小心众输了一个0就MLE了。(普通状况下,256M内存的话,int数组最众可能开到 5 * 10^7 )
逐鹿前末了15分钟肯定要搜检一下本身的全豹代码,包含如下实质:极少调试语句是否仍旧被诠释,源代码/输入文献/输出文献的文献名是否确切,极少不该被诠释的语句(freopen以及fclose)是否删去诠释。
NOIP赛场上STL肯定要少用!(当然,假若你是NOI玩家,当我什么都没有说)
最首要的一点!列位OIer记得考前摆善意态,通常攒攒RP,或者省一就得手了呢。
万分谢谢@ComeIntoPower办理员的辛苦审核,以及我校xqmmcqs和wondove两位学长教学他们的OI履历,没有他们带给我的诱导,就不会有本文的出世。
转载请注明出处:MT4平台下载
本文标题网址:洛谷日报第86期]NOIP选手必知的编程技巧