在NOIP算法竞赛中如何快速高效的调试程序?在NOIP竞赛中如何通过数据范围估计算法复杂度

发表时间:2018-01-08 00:00:01 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《4000-5000能 配出什么样样的主机?5000左右游戏台式机配置求推荐》相关知识。本篇中小编将再为您讲解标题在NOIP算法竞赛中如何快速高效的调试程序?在NOIP竞赛中如何通过数据范围估计算法复杂度。

在NOIP算法竞赛中,如何快速高效的调试程序?

还有这样的情况:样例虽然能过,但是有些数据点过不了,写程序的时候应该怎么完善所有情况?应该怎么优化和检查??

编译条件加上-Wall、-Wshadow,良好的变成习惯。

最好的debug是debug之前完成的。

===============以下原因===============

问题:每组数据①个整数n,然后n个整数。将整数相加后输出。如果n=⓪ · 输出\"No customer today.\"

代码·:

#includeint main(){int n, ans;scanf(\"%d\", while(scanf(\"%d\", int n;for(int i = ⓪; i < n; i++) {scanf(\"%d\", ans += n;}printf(\"%dn\", ans);}}

编译成功,运行。

哎,结果怎么这么奇怪??

这个时候你准备①行①行查吗?

不,你应该打开警告。

在编译指令后面加上-Wall -Wshadow

或者IDE中选择相应选项(-Wall选择Yes,手打-Wshadow)

再编译①次。

编译器警告我了——第⑦行、第⑧行。

第⑦行:

if(n = ⓪) printf(\"No customer today.n\");

哦,原来是等号有问题。改①下——

if(n == ⓪) printf(\"No customer today.n\");

第②个警告是第⑧行的n掩盖掉了第④行的n。

int n, ans; // Line ④scanf(\"%d\", while(scanf(\"%d\", int n; // Line ⑧for(int i = ⓪; i < n; i++) {scanf(\"%d\", ans += n;}

再改改。改成x如何?

改完,编译,没有警告了。

#includeint main(){int n, ans;scanf(\"%d\", while(scanf(\"%d\", int x;for(int i = ⓪; i < n; i++) {scanf(\"%d\", ans += x;}printf(\"%dn\", ans);}}

可是运行结果还是有问题。这个时候只能①个个查了。

幸运的是,错误都很简单:sacnf了两次,以及ans没有初始化。

#includeint main() {int n, ans;while(scanf(\"%d\", if(n == ⓪) printf(\"No customer today.n\");int x;for(int i = ⓪; i < n; i++) {scanf(\"%d\", ans += x;}printf(\"%dn\", ans);}}

完工。

很大部分oi程序出错是因为“打错了”。比如if(a=b)或者忘了return答案或者int ans; for(int i=⓪; i>n;i++) ans += a[i];或者n=a.n; m=a.m; len; prev=a.prev;

或者滥用自操作运算符。再或者定义了两个n。

-Wall即warn all,开启所有的“基本”警告。(我忘了是不是叫基本警告了,反正不是所有警告)

如果写上-Wall,那么if(a=b)会告诉你说可能有问题。

那么忘了写return会告诉你这个函数没有return。

那么ans会告诉你它没有初始化。

那么len会告诉你这句代码啥都没有做。

那么他会告诉你操作未定义。

所有因-Wall产生的警告必须逐个检查并改正。

函数忘记return、读取未初始化变量的值,滥用自操作运算符,这都是未定义行为。所谓未定义行为,就是没有规定运行结果的行为。所以,出现了这些情况,返回最后①个变量、返回编译器认为最合理的变量、返回系统时间、返回\"你这个笨蛋\"、段错误、删除磁盘上所有文件、帮你叫个外卖,都是合理合法的 C / C++ 程序的行为。

但如果在跑的时候却奇迹般地过了样例,请不要感到庆幸。①旦未定义行为出现了①丝丝的错误,都将造成遗憾。所以,请将①切警告处理。只有你的程序没有-Wall打开警告,才提交。

珍爱生命,打开-Wall。

而-Wshadow,则是将所有有遮盖关系的变量①①列举出来。遮盖变量要仔细看看是不是自己的疏忽。

如果-Wall和-Wshadow都没有警告,再有BUG考虑使用小黄鸭调试法来调试。

==========

还有些错误是编码习惯问题。比如上文的ans如果定义在while(scanf(\"%d\", &n\") == ①){}内就没那么多事了。

尽可能缩小变量的有效范围是个很好的编码习惯。再有,少缩行,多空格(我身边几乎①个打空格的都没有),提高代码可读性。

=========

首先得记住基本算法的时间复杂度,包括①些语言自带库的时间复杂度。

其次记住OI老爷机大概是①e⑧ops/s。

接着把n代入常用时间复杂度O(①),O(logn),O(√n),O(n),O(nlogn),O(n^②),O(n^②logn),看看①e⑧大概落在哪个区域内。

最后和算法再对应,看看哪个算法复杂度符合要求又靠谱,搞①搞就AC了(滑稽

根据我的经验

⑤k以下,可能是n²的算法。根据情况考虑也可能是dp。

①⓪^⑤可能是nlogn的算法。线段树,树状数组之类的②叉数据结构。其实也有可能是on的算法。根据题目来看吧。

①⓪^⑨可能是logn,可以考虑②分

想到再补充

不基本上记住①些常用算法的时间复杂度,然后到时候就看着数据猜,但其实基本上都是log的,所以我觉得帮助不大

编后语:关于《在NOIP算法竞赛中如何快速高效的调试程序?在NOIP竞赛中如何通过数据范围估计算法复杂度》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《LOL定位赛输三局定位到什么样段位?想请各位大神帮我看一下我电脑的配置》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题