C/C++快读(快速读入)有多——安全AC
2019-08-16 07:56:57来源:博客园 阅读 ()
C/C++快读(快速读入)有多——安全AC
在一些算法题目中中,有的程序会被卡常(数),就是说,程序虽然渐进复杂度,(通俗来讲:算法的时间复杂度)可以接受,但因为算法本身的时间常数过大,导致程序在一些算法竞赛中超时。这是,快读就显得尤为重要了。
当然,如果程序算法本身就不高效,快读就更加重要了,可以让一些暴力程序获得更多的测试点分数,如果数据不大甚至能AC,此时快读就是“得分法宝”
快速读入可以让大家的输入更快,这里做了一个测试:快读究竟有多快?(编译器dev-c++ 5.5.3,标准模式(非debug))
1 #include <cstdio>
2 #include <ctime>
3 #include <iostream>
4 #define LOOP 2 //循环次数
5 #define DATA 100000 //数据规模
6 struct dat{
7 int i,s,c;dat(int a=0,int b=0,int k=0){i=a,s=b,c=k;}
8 }dats[100+1];
9 inline int Readi(){//快读
10 int x;
11 int fh=1;
12 char a=getchar();
13 while('0'>a || '9'<a){//首先过滤掉非数字字符(注意符号的处理)
14 if(a=='-') fh=-1;
15 a=getchar();
16 }
17 while('0'<=a && a<='9'){//小技巧:x=x*10 可以进位
18 x=x*10+a-'0';
19 a=getchar();
20 }
21 return x*fh;
22 }
23 void TryPrint(){
24 FILE* fp=fopen("in.txt","w");//输出数据
25 for(int i=1;i<=DATA;++i)fprintf(fp,"%d ",i);
26 fclose(fp);//关闭文件
27 //一定要注意,不关闭文件,数据会写到缓冲区里,可能会丢数据)
28 }
29 void TryReadi(){
30 int t;for(int i=1;i<=DATA;++i)t=Readi();
31 }
32 void TryReads(){
33 int t;for(int i=1;i<=DATA;++i)scanf("%d",&t);
34 }
35 void TryReadc(){
36 int t;for(int i=1;i<=DATA;++i)std::cin>>t;
37 }
38 int main(){
39 freopen("out.txt","a",stdout);
40 printf("数据规模:%d 循环次数:%d 单位:ms\n",DATA,LOOP);
41 freopen("in.txt","r",stdin);//读入数据文件(只读)
42 for(int k=1;k<=LOOP;++k){
43 freopen("out.txt","a",stdout);
44 freopen("in.txt","r",stdin);//读入数据文件(只读)
45 TryPrint();clock_t p=clock();
46 TryReadi();clock_t i=clock();
47 TryReads();clock_t s=clock();
48 printf("快读:%u\n",i-p);
49 printf("scanf输入:%u\n",s-i);
50 dats[k]=dat(i-p,s-i,0);
51 }
52 double sum=0.0;for(int k=1;k<=LOOP;++k)sum+=dats[k].i;printf("快读平均:%.0f\n",sum/LOOP);
53 sum=0.0;for(int k=1;k<=LOOP;++k)sum+=dats[k].s;printf("scanf平均:%.0f",sum/LOOP);
54 return 0;
55 }
View Code
快速读入代码:大家可以自己修改,在自己电脑上测试(注意:cin这里我在测试时出现了读入都是零的问题,导致时间过少,求各位大神解决)
测试结果
数据规模:1000000 循环次数:5 单位:ms
快读:50
scanf输入:1113
快读:50
scanf输入:1130
快读:58
scanf输入:1116
快读:52
scanf输入:1168
快读:51
scanf输入:1130
快读平均:52
scanf平均:1131
由此得,快读比scanf快了很多。所以大家在读入较大数据规模时,应尝试快读。
在我的测试中,快写就没有快读那么神奇了,反而比scanf/printf更慢,可能是由于进行了过多的除法和取余数
原文链接:https://www.cnblogs.com/cdsidi/p/11269232.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash