• 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
    ",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
    ",i-p);
    49         printf("scanf输入:%u
    ",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
    ",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更慢,可能是由于进行了过多的除法和取余数

  • 相关阅读:
    【学习笔记】数据库设计那些事
    django rest-farme-work 的使用(3)
    django rest-farme-work 的使用(2)
    docker 的安装
    中国电信线CTF线下选拨writeup
    django rest-farme-work 的使用(1)
    谈谈python里面关于任务队列
    kubernetes 部署
    凯撒密码的加密解密
    Linux 密码的暴力破解
  • 原文地址:https://www.cnblogs.com/cdsidi/p/11269232.html
Copyright © 2020-2023  润新知