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的现场赛会规定输入输出 或者是文件输入标准输出 也可能是文件输入文件输出 如果没有规定的话那么一般就是标准的输入输出了 那说一下输入输出的重定向 一般用下面两 ...
随机推荐
- PHP之音乐ID3扩展
不知道你有没有这样的经历,一些从网上下载的MP3音乐,文件名明明是01.02这样的序号,但播放时却能显示出歌曲的正确名称来,是不是有点奇妙? 这其实都是ID3在暗中相助 ID3,一般是位于一个mp3文 ...
- linux 进程监控和自动重启的简单实现(转)
目的:linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能. 实现原理:由定时任务crontab调用脚本,脚本用ps检查进程是否存在,如果不存在则重 ...
- linux expr命令参数及用法详解
expr用法 expr命令一般用于整数值,但也可用于字符串.一般格式为: #expr argument operator argument expr也是一个手工命令行计数器. #$expr 10 + ...
- 介绍XXTEA加密算法及其C实现
介绍XXTEA加密算法及其C实现 http://en.wikipedia.org/wiki/XXTEA “微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA)都是分组加密算法 ...
- Spring 与 mybatis整合 Error parsing Mapper XML. Cause: java.lang.NullPointerException
mapper配置文件中的namespace没有填:而且namespase的值应该填为:mapper的权限定名:否则还是会抛出异常 org.springframework.beans.factory.B ...
- WPF之TabControl控件用法
先创建实体基类:NotificationObject(用来被实体类继承) 实现属性更改通知接口: using System; using System.Collections.Generic; usi ...
- 转 : net use的使用
老是忘了 net use 怎么样,今天在网上找一篇,贴在这,感谢原作者分享. 1 查看远程主机的共享资源(但看不到默认共享) net view \\IP 2向远程主机复制文件 copy \路径 ...
- linux的学习系列 8---进程管理
当我们运行程序时,Linux会为程序创建一个特殊的环境,该环境包含程序运行需要的所有资源,以保证程序能够独立运行,不受其他程序的干扰.这个特殊的环境就称为进程. 每个 Linux 命令都与系统中的程序 ...
- Factory and AbstractFactory ——抽象与具体的分离
Factory and AbstractFactory——抽象与具体的分离 面向对象标准关注于抽取一系列事物的共同行为,组建一个基类.行为再划分成两类: 1:现在及以后不太可能会变化的行为. 2:以后 ...
- 为Android系统内置C可执行程序测试Linux内核驱动程序
在前一篇文章中,我们介绍了如何在Ubuntu上为Android系统编写Linux内核驱动程序.在这个名为hello的Linux内核驱动程序中, 创建三个不同的文件节点来供用户空间访问,分别是传统的设备 ...