§缘
不知大家有没有这种体验,做一道题目,即便自己用了很有可能过的算法(如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%