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

    §缘


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值