—— 简单介绍一下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录 之 输入输出。的更多相关文章

  1. [ACM训练] ACM中巧用文件的输入输出来改写acm程序的输入输出 + ACM中八大输入输出格式

    ACM中巧用文件的输入输出来改写acm程序的输入输出 经常有见大神们使用文件来代替ACM程序中的IO,尤其是当程序IO比较复杂时,可以使自己能够更专注于代码的测试,而不是怎样敲输入. C/C++代码中 ...

  2. ACM之Java输入输出

    本文转自:ACM之Java输入输出 一.Java之ACM注意点 1. 类名称必须采用public class Main方式命名 2. 在有些OJ系统上,即便是输出的末尾多了一个“ ”,程序可能会输出错 ...

  3. 在竞赛ACM Java处理输入输出

    一.Java之ACM注意点 1. 类名称必须采用public class Main方式命名 2. 在有些OJ系统上,即便是输出的末尾多了一个“ ”,程序可能会输出错误,所以在我看来好多OJ系统做的是非 ...

  4. ACM竞赛之输入输出

    http://acm.njupt.edu.cn/acmhome/problemdetail.do?id=1083&method=showdetail 比赛描述 字符串的输入输出处理. 输入 第 ...

  5. ACM录 之 常识和错误。

    接下来说说一些ACM里面的常识和错误...(可能会比较乱) —— 首先ACM里面的代码都是要提交上去,然后让计算机自动判题的,所以...千万不要把 system("pause"); ...

  6. ACM竞赛之输入输出(以C与C++为例)

    本文转自互联网,内容.排版有修正. 欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju G ...

  7. 新手入门 acm 输入输出练习

    A + B Problem(1000) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  8. 关于OJ的输入和输出(转)

    ACM竞赛之输入输出以下内容来源于互联网.在ACM程序设计竞赛中,一道题目的所有测试数据是放在一个文本文件中,选手将一道题目的程序提交给评判系统运行,程序从该文件中读取测试数据,再把运行结果输出到另一 ...

  9. ACM的输入输出总结

    关于ACM的输入输出(一) 一般来说ACM的现场赛会规定输入输出 或者是文件输入标准输出 也可能是文件输入文件输出 如果没有规定的话那么一般就是标准的输入输出了 那说一下输入输出的重定向 一般用下面两 ...

随机推荐

  1. Snackbar使用及其注意事项(转)

    http://blog.csdn.net/jywangkeep_/article/details/46405301 Snackbar使用及其注意事项 引言 Snackbar是Android Suppo ...

  2. MyEclipse build path no actions available

    MyEclipse,是在eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于Java.Java EE以及移动应用的开发.MyEclipse的功能非常强大,支持也十分广泛 ...

  3. //获取url中"?"符后的字串

    //获取url中"?"符后的字串 function getParamByUrl(url) {    var theRequest = new Object();    var in ...

  4. php 环信 接口的例子

    <?php class Hxcall{ private $app_key = 'yunjiankang#medical'; private $client_id = 'YXA6ARjBgDnxE ...

  5. sql快速参考

    SQL 语句 语法 AND / OR SELECT column_name(s)FROM table_nameWHERE conditionAND|OR condition ALTER TABLE A ...

  6. 后台如何解析json

    1.以前倒是没有怎没遇到过需要后台解析的,由于json传到后台实际上是传的一个字符串通常用到批量删除时 var rows = $('#tt').datagrid('getSelections'); v ...

  7. ExtJS4 的dom

    Ext使用了三个核心的工具类对我们掌握的DOM进行了完美的封装. ┣ Ext.Element(几乎对DOM的一切进行了封彻底装) ┣ Ext.DomHelper(一个强大的操控UI界面的工具类) ┣ ...

  8. POJ - 3061 Subsequence(连续子序列和>=s的最短子序列长度)

    Description A sequence of N positive integers (10 < N < 100 000), each of them less than or eq ...

  9. 2333: [SCOI2011]棘手的操作[写不出来]

    2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1979  Solved: 772[Submit][Stat ...

  10. Windows API 之 ReadProcessMemory

    ReadProcessMemory: BOOL WINAPI ReadProcessMemory( _In_ HANDLE hProcess, _In_ LPCVOID lpBaseAddress, ...