在一些算法题目中中,有的程序会被卡常(数),就是说,程序虽然渐进复杂度,(通俗来讲:算法的时间复杂度)可以接受,但因为算法本身的时间常数过大,导致程序在一些算法竞赛中超时。这是,快读就显得尤为重要了。
当然,如果程序算法本身就不高效,快读就更加重要了,可以让一些暴力程序获得更多的测试点分数,如果数据不大甚至能AC,此时快读就是“得分法宝”
快速读入可以让大家的输入更快,这里做了一个测试:快读究竟有多快?(编译器dev-c++ 5.5.3,标准模式(非debug))
1 #include2 #include 3 #include 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' >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 }
快速读入代码:大家可以自己修改,在自己电脑上测试(注意:cin这里我在测试时出现了读入都是零的问题,导致时间过少,求各位大神解决)
测试结果
数据规模:1000000 循环次数:5 单位:ms
快读:50scanf输入:1113快读:50scanf输入:1130快读:58scanf输入:1116快读:52scanf输入:1168快读:51scanf输入:1130快读平均:52scanf平均:1131由此得,快读比scanf快了很多。所以大家在读入较大数据规模时,应尝试快读。
在我的测试中,快写就没有快读那么神奇了,反而比scanf/printf更慢,可能是由于进行了过多的除法和取余数