【考试技巧】输入输出优化

来源:互联网 发布:沧州管家婆软件总代理 编辑:程序博客网 时间:2024/05/18 22:41

    §缘


    不知大家有没有这种体验,做一道题目,即便自己用了很有可能过的算法(如O(nlogn)、O(n^2)),但是不知是什么原因(当然很可能是代码丑)而超时或耗时较长(什么800ms之类),把代码丑这一因素完全摒除(把代码写精简,不啰嗦做无用的事),然后还是不能取得高分,那么我们就要看看是不是输入输出过大了。以下就是一个例子:


时间超限(代码丑&没有输入输出优化)94%


    因为cin、cout可以说是慢到极点(需要判断不同数据结构用不同方式输入输出),而scanf和printf又需要兼容各种%d、%lf、%lld(%I64d)、%x、%o、%f、%s、%c、%g各种奇奇怪怪的输入输出模式,当然也会耗些时啦(我的理解是这样)。所以我们就需要一种更加迅捷、精巧、无脑的输入输出方式,于是就有了接下来的内容。


    §思


    可是我们知道了scanf和cin的坏处,却不知道怎么去解决依然不行。什么东西可以快过scanf呢?其实,我们只要用心观察过scanf读入的写法就可以知道——相比整数,字符好像优先级更高。因为同样是数组,字符数组不用加&取值符就可以输出(当然可能还是我的臆想)。所以我们可以很容易的发现,getchar()和putchar()其实是很快很快的!于是乎,读入就可以向getchar()学习,写出一个极速无脑的getint(),而输出则有putint()。


    §寻


    好吧,那么我们就可以使用最为原始的方法,像一个三岁小孩一样去读入每一个数字了。具体实现输入就不用说了,可以自己很容易的完成。想起了2016年的NOIP普及组初赛……

    那么我们看这个试题,就知道读入优化怎么写了(什么?你不知道被抠掉的空是什么?)还是得放上代码:


int getint(){int p=0;bool f=0;char c=getchar();while((c<'0'||c>'9')&&c!='-')c=getchar();if(c=='-'){f=1;c=getchar();}while(c>='0'&&c<='9'){p=p*10+(c-'0');c=getchar();}if(f)p=-p;return p;}


    输出优化就没有多大必要,可以使用递归输出,如果一个数小于10,直接输出,否则先输出十位及以上部分,然后输出个位。如果是负数,先输出‘-’,再当成正数输出即可。代码也是有的:

void putint(int p){if(p<0)putchar('-'),p=-p;if(p>9)putint(p/10);putchar(p%10+'0');}


    §结


    至此,我们已经知道了输入优化和输出优化了,当然如果你用了这个还是超时,请把你的代码写好看一点(或是摒弃你的算法,换一个高效的),不然你还是只能看到:

第1次提交:时间超限(代码丑)99%

第2次提交:时间超限(代码丑)99%

第3次提交:时间超限(代码丑)99%

第4次提交:时间超限(代码丑)99%

。。。

第N次提交:时间超限(代码丑)99%

0 0
原创粉丝点击