1. 关于算法运行时间以及“管道”为什么引入。
我以前毕设比较不同译码算法的时候,直接用一个clock()来比较不同算法运行速率。现在想起来,这是及其错误了!
《算法竞赛入门经典》P64
一个程序中计时函数clock()的使用。该函数返回程序目前为止运行的时间。这样,在程序结束之前调用此函数,便可获得整个程序的运行时间。这个时间除以常数CLOCKS_PER_SEC之后得到的值以“秒”为单位。
提示2-17:可以使用time.h和clock()函数获得程序运行时间。常数CLOCKS_PER_SEC和操作系统相关,请不要直接使用clock()的返回值,而应总是除以CLOCKS_PER_SEC。
输入“20”,按Enter键后,系统瞬间输出了答案820313。但是,输出的Time used居然不是0!其原因在于,键盘输入的时间也被计算在内——这的确是程序启动之后才进行的。为了避免输入数据的时间影响测试结果,可使用一种称为“管道”的小技巧:在Windows命令行下执行echo 20|abc,操作系统会自动把20输入,其中abc是程序名 。如果不知道如何操作命令行,请参考附录A。笔者建议每个读者都熟悉命令行操作,包括Windows和Linux。
2. 输入输出框架
在做CCF的模拟题的题一,我常用的一个方法是
int n; cin>>n; int A[n]; int i; for(i=0;i<n;i++){ cin>>A[i]; }
其实这样往往遇到一个问题,如果输入没有先输入n这一个步骤,而是任意输入的数字流,就不知所措了。
在《算法竞赛入门指导》P66,有如下
while(scanf("%d", &x) == 1) { s += x; if(x < min) min = x; if(x > max) max = x; n++; } printf("%d %d %.3f\n", min, max, (double)s/n);
可以用while(。。。!=0)之类的判断吧。
对于C语言
还记得scanf的输入格式吗?空格、TAB和回车符都是无关紧要的,所以按Enter键并不意味着输入的结束。那如何才能告诉程序输入结束了呢?
提示2-19:在Windows下,输入完毕后先按Enter键,再按Ctrl+Z键,最后再按Enter键,即可结束输入。在Linux下,输入完毕后按Ctrl+D键即可结束输入。
对于C++
cin会在空格位置就停止的,getline才可以读到回车,网上看到的,以后注意。