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的现场赛会规定输入输出 或者是文件输入标准输出 也可能是文件输入文件输出 如果没有规定的话那么一般就是标准的输入输出了 那说一下输入输出的重定向 一般用下面两 ...
随机推荐
- max_%_connection参数详解
对于连接数的设置,show variables里有三个参数可以对它进行控制,max_connections与max_user_connections以及max_connect_errors.下面对这三 ...
- [maven] 新建项目一直提示loading archetype list
Maven's JRE is running out of memory. Under Build > Build Tools > Maven > Importing, set &q ...
- 一款值得推荐的shell工具
1. 一款比较出色的shell工具 熟练的运用shell语言可以提高我们的工作效率,而一款好的shell工具能提高学习的效率,fish shell就是这样一款工具.并且是一款跨平台的工具, 同时可以在 ...
- VS2010+PCL+openni配置
PCL中文论坛:http://www.pclcn.org/bbs/forum.php 1.安装 pcl 的完全安装包可以到: http://pointclouds.org/downloads/wind ...
- linux视频学习(简单介绍)20160405
看一周学会linux系统的学习笔记. 1.linux系统是一个安全性高的开源,免费的多用户多任务的操作系统. 2.linux工作分为linux系统管理员,linux程序员(PC上软件开发,嵌入式开发) ...
- HUD 1541/BIT(数状数组)
题目链接 /* 按从左到右,从下到上的顺序给出星星的坐标,计算出level为[0,n)的星星的个数. 星星的level为该星星左下边(包括自己正下方的星星,但是不包括自己)星星的个数. BIT模板题. ...
- php 日期处理 例子
<?php date_default_timezone_set('PRC'); //默认时区 echo "今天:",date("Y-m-d",time() ...
- java复用类
java复用类英文名叫reusing classes ,重新使用的类,复用的意思就是重复使用的类,其实现方法就是我们平常使用的组合和继承: 1.组合: has-a 的关系 (自我理解:组合就是我们 ...
- PAT1027
People in Mars represent the colors in their computers in a similar way as the Earth people. 火星人在他们的 ...
- 最小生成树Prim
首先解释什么是最小生成树,最小生成树是指在一张图中找出一棵树,任意两点的距离已经是最短的了. 算法要点: 1.用book数组存放访问过的节点. 2.用dis数组保存对应下标的点到树的最近距离,这里要注 ...