算法竞赛入门教程-输入输出与数据处理进阶学习

输入输出进阶学习

在做题的过程,数据读入是第一步,如果卡在这那么任何算法都是无能为力的,正确的将数据放在自己想要的地方也是至关重要的,输出也是同样的道理。下面来讲解在输入输出中会遇到的一些坑点,以及优化细节。

stdio.h and iostream

在c语言中我们常常用scanf 和printf 来输入输出,在进一步学习c++后cin,cout会出现到我们的视线,那么这两种方案具体有何区别呢?

scanf和cin的利弊:

scanf:
利:耗时短,写法方便输入固定格式,比如scanf("%*d%d",&a),可以直接忽略第一个输入,不用创建新对象,再比如scanf("%1d",&x[i]),输入3214,中间没有空格,但是用for循环输入%1d,可以每次只截取一个数字来输入,这样输入的就是3,2,1,4数字数组,再比如输入时间格式YY-MM-DD HH:MM:SS,可以用scanf("%2d-%2d-%2d %2d:%2d:%2d",&year,&month,&day,&hour,&mintue,&second)
弊:不能输入string,如果题目简单没有时间上的紧迫,写scanf会比写cin慢

cin:
利:可以输入string,string本身的好处就不说了,写起来快
弊:耗时长(数据规模达到5e5就要慎重考虑使用cin读入),耗时长的原因是c++需要向下c兼容,就是你用cin等c++函数,但是编译器还会预处理scanf等c函数,尽管可以加ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);手动关闭c的兼容,但是这样会导致你只能用c++的函数,c的所有函数你都用不了,用了就会re(不会报错)

cout
需要注意的是1e5的endl会消耗巨大时间,可以替换为‘\n’

可恶的字符串

坑点1
先读入数字,再读入char,大概率会读取到一个换行,需要记得getchar()
坑点2
遇到空格 %s会被中断,如果想要整行读入建议使用getline(),getline需要配合string类型一起使用,getline(cin,string)
坑点3
前导0,有的模拟题目要求不能有前导0(剩下一位时需要保留) stoll(string)
坑点4
进行数字值计算时,建议先变成整形再to_string

多组数据初始化

当题目遇到多组数据时,务必考虑到初始化的问题,其中不能盲目的使用memset它的时间复杂度是O(n),如果组数巨大,且数组长度很长时按需初始化(手写循环)

二维数组内存超限

假设行为n,列为m,上界各为1e4但nm<=1e7,这时候采取直接开num[10005][10005]会超限,但是可以把二维数组压缩成一维使用
num[i
k+j]代表num[k][j]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值