ACM录 之 输入输出。
—— 简单介绍一下ACM里面的输入输出。。。
—— 主要说C++的输入输出(其实其他的我不会。。。)。
—— C++里面有输入输出流,也就是cin和cout,用起来也算是比较方便吧。。。
—— 但是,ACMer好像不怎么用这个,大都用scanf,printf这两个不是很方便的C语言遗留输入输出函数,因为。。。
—— 大家都用的cin cout逼格太低了,是吧。。。
—— 饿,开个玩笑,其实是因为效率的问题了,C++是兼容C语言的,为了兼容scanf和printf这些老一辈的输入输出,所以他很贴心的,让cin和cout这种输出输出流的代码里面多了一个步骤,就是检查scanf和printf的缓冲区,防止出现cin和scanf两种同时用的时候导致的混乱。。。
—— 但是。。。如此贴心的关怀是要付出代价的,就是时间。。。之后会测试一下时间差距。。。
—— 先来说说scanf和printf。。。
—— 至于scanf和printf怎么用。。。谷歌或者百度吧。。。有的是详细的介绍和使用方法,把其中主要的记住就行,一些奇怪的东西不记也罢。
然后关于ACM里面的输入输出,请看 点我点我 。看看这篇就差不多了。。。
至于还有一些比较坑爹的输入输出要求的话就需要发挥大家的智慧了。。。
/////////////////////////////////////////////////////////////////////
—— 当面对很多很多数据要输入或者输出的时候,两者所消耗的时间差距很大很大。。。那么下面做个实验吧。
首先先生成一个txt文件,里面有10000000个数,然后写个程序分别使用cin和scanf测试一下读入这些数的速度。(通过操作系统的管道可以直接读取文件,之后说。)
首先试试cin。
代码如下:
#include <iostream>
#include <cstdio>
#include <ctime> using namespace std; int main()
{
clock_t t=clock(); int x;
int N=; for(int i=;i<N;++i)
cin>>x; cout<<clock()-t<<endl; return ;
}
然后运行一下输出的是 4104488 us,也就是4秒多,就能读完这10000000个数。
然后再试试scanf:
#include <iostream>
#include <cstdio>
#include <ctime> using namespace std; int main()
{
clock_t t=clock(); int x;
int N=; for(int i=;i<N;++i)
scanf("%d",&x); cout<<clock()-t<<endl; return ;
}
输出 1201028us,也就是1秒多。。。
饿,这我不用多说了吧,哪个快哪个慢。。。
—— 在ACM的题目里面是有时间限制的,也就是要求程序必须在规定时间内运行完,所以说代码当然是越快越好了。。。
—— 当然对于输出或者输出量比较小的,这两个就无所谓了,但是如果对于很多数据的输入输出。。。那么,用哪个就不多说了。。。
—— 其实cin和cout是可以逆袭的,因为他们要贴心的检查缓冲区,所以才很慢,那么不让他检查不就完了。
—— 是的,是有代码可以关掉缓冲区检查的,下面来实验一下。
代码如下:
#include <iostream>
#include <cstdio>
#include <ctime> using namespace std; int main()
{
clock_t t=clock(); ios::sync_with_stdio(false); ///// int x;
int N=; for(int i=;i<N;++i)
cin>>x; cout<<clock()-t<<endl; return ;
}
输出的时间是 1102463 us,果然。。。逆袭成功了。。。成功了。。。
—— 但是这里要注意一些问题,使用了上面那句代码之后,千万不要再用scanf和printf,千万不要再用scanf和printf,千万不要再用scanf和printf。
—— 因为这时cin和cout可能会和printf他们不同步了,可能输出的顺序会混乱,这样连死都不知道是怎么死的。。。
—— 另外就是这句话不是万能的,可能会不管用,亲身体验,血一样的教训,有一道题目不管怎么改都超时,直到。。。改成scanf,就好了。。。然后,从此再也不用那句话了,改成一定用scanf和printf了。
—— 当然了如果不是ACM的话还是用cin和cout吧,毕竟他们年轻。。。据说更安全。。。
//////////////////////////////////////////////////////////////////////
—— 关于文件输入输出。
—— 那些打开文件然后读的就不说了,毕竟比较麻烦。说个省事的。。。
—— freopen函数,重定向函数,一般ACM里面是这样用:
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
—— 第一个表示用 r (read)的方式打开 in.txt 文件,然后把 stdin 重定向到 in.txt 这个文件,也就是在之前的时候 stdin(标准输入)是键盘,之后标准输入就是那个文件了,所以每次cin就不是从键盘读入了,而是从那个文件。
—— 第二句同理。。。把标准输出重定向。。。就不输出到屏幕而是那个文件了。。。
—— 这里注意这样干只是方便自己调试,比如输入的数据很多,一个个手打太慢了。。。提交上去之前千万记得删掉或者注释掉,因为大部分题目要求的是标准输入输出。
—— 然后还有一种重定向,是关于操作系统的,ACM的判题机其实就是用的这个,机器把你提交的代码重定向到某个数据文件,然后输出也重定向到另一个文件,然后运行程序,然后运行完成的时候比较输出文件和正确的输出文件有没有不同,有的话就是不对,没有就是对了,所以写的程序每读入一组数据算出结果然后输出就行,不用一次性把所有数据读入。。。
—— 然后具体这种怎么搞自行百度谷歌吧,其实不会也没啥,比如我。。。o(╯□╰)o
输入输出想的起来的差不多就这些。。。
ACM录 之 输入输出。的更多相关文章
- [ACM训练] ACM中巧用文件的输入输出来改写acm程序的输入输出 + ACM中八大输入输出格式
ACM中巧用文件的输入输出来改写acm程序的输入输出 经常有见大神们使用文件来代替ACM程序中的IO,尤其是当程序IO比较复杂时,可以使自己能够更专注于代码的测试,而不是怎样敲输入. C/C++代码中 ...
- ACM之Java输入输出
本文转自:ACM之Java输入输出 一.Java之ACM注意点 1. 类名称必须采用public class Main方式命名 2. 在有些OJ系统上,即便是输出的末尾多了一个“ ”,程序可能会输出错 ...
- 在竞赛ACM Java处理输入输出
一.Java之ACM注意点 1. 类名称必须采用public class Main方式命名 2. 在有些OJ系统上,即便是输出的末尾多了一个“ ”,程序可能会输出错误,所以在我看来好多OJ系统做的是非 ...
- ACM竞赛之输入输出
http://acm.njupt.edu.cn/acmhome/problemdetail.do?id=1083&method=showdetail 比赛描述 字符串的输入输出处理. 输入 第 ...
- ACM录 之 常识和错误。
接下来说说一些ACM里面的常识和错误...(可能会比较乱) —— 首先ACM里面的代码都是要提交上去,然后让计算机自动判题的,所以...千万不要把 system("pause"); ...
- ACM竞赛之输入输出(以C与C++为例)
本文转自互联网,内容.排版有修正. 欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju G ...
- 新手入门 acm 输入输出练习
A + B Problem(1000) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- 关于OJ的输入和输出(转)
ACM竞赛之输入输出以下内容来源于互联网.在ACM程序设计竞赛中,一道题目的所有测试数据是放在一个文本文件中,选手将一道题目的程序提交给评判系统运行,程序从该文件中读取测试数据,再把运行结果输出到另一 ...
- ACM的输入输出总结
关于ACM的输入输出(一) 一般来说ACM的现场赛会规定输入输出 或者是文件输入标准输出 也可能是文件输入文件输出 如果没有规定的话那么一般就是标准的输入输出了 那说一下输入输出的重定向 一般用下面两 ...
随机推荐
- c++判断一个字符串是否是数字
bool isNum(const string& str) { bool bRet = false; bool point = false; ) { return bRet; } ]) &am ...
- Myclipse 安装 Maven遇见的N个异常
1.Maven 下载好,配置完环境变量,同时在Myeclipse配置好Maven,这时创建Maven项目失败,报如下异常: Could not resolve archetype org.apache ...
- 转 shell中字分隔的妙用:变量IFS
IFS 的全称是 Interal Field Separator ,即"内部区域分隔符",它也是一个内置环境变量,存储着默认的文本分隔符,默认下这分隔符是空格符(space c ...
- 1.1 sikuli 安装
JRE7不支持sikuli,必须下载JRE6 更新号必须大于35 sikuli下载: http://www.cr173.com/soft/52775.html 或参照 http://www.cnb ...
- POJ 1182 食物链 经典并查集+关系向量简单介绍
题目: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有 ...
- CentOS下载及版本选择-CentOS LiveCD、LiveDVD和BinDVD区别
1.CentOS系统镜像有两个,安装系统只用到第一个镜像即CentOS-6.x-i386-bin-DVD1.iso(32位)或者CentOS-6.x-x86_64-bin-DVD1.iso(64位), ...
- gameUnity 0.15alpha 网络游戏框架
在重要版本 0.2之前,先 出一个 0.15alpha 版本热热身. 0.15主要是添加了 动画事件 和一些 动画特效的类,比如快进,慢进,(类似被冰冻效果),但这些都不在这个 alpha版本中出现 ...
- sql 指定范围 获取随机数
DECLARE @nMinimumCount INT= 1DECLARE @nMaximumCount INT= 100SELECT abs(CHECKSUM(NEWID()))%(@nMaximum ...
- java 数据流
Example10_11.java import java.io.*; public class Example10_11 { public static void main(String args[ ...
- UVALive 7291 Kinfolk(最近公共祖先)
题目中的描述就很最近公共祖先,再说其实这个题并不难,就是麻烦点(代码其实可以化简的),我写的判定比较多. 方法:求出两者的最近公共祖先lca,在求出两者到lca的距离 分析:给出a和b,如果LCA(a ...