前言
准备这类竞赛的话,除了学习如何编写对应题目的代码之外,还需要掌握各种各样的小技巧,以及学会和竞赛相关的一些知识,所以这里打算记录一些和竞赛相关的部分内容。(还没写完,持续更新)
PS:以下内容不建议直接观看,这些知识虽然有用,但是不是任何时候都用得上,建议需要用上相关知识的时候再过来学习,这样比较容易记住。不过如果你确实对这些内容感兴趣的话,那么现在直接看也无妨。
获取时间程序运行时间
竞赛做题不只是要求写出能够完成指定功能的代码,还要求程序能够在只使用限定的内存大小并且在指定的时间之内得出正确答案并结束程序,也就是所谓的时空限制(时间和空间限制),时空限制一般会随着题目一起给出来,比如下图。
自己代码用到的空间一般是通过自己分析自己的代码得出来的,比如这道题我只用到了a和b两个int型变量,一个int是4字节,所以我这道题就只用了8B的空间,计算就知道了。
自己的代码运行所需时间的话,有时候也能通过分析代码的出来,但是有时候分析起来比较困难,又或者是你不知道怎么分析或者对于某些你没考虑到的数据不知道运行时间是多少(有时候题目会附赠一些测试数据,供你对自己的代码进行测试,这时候也可以用代码算出来具体运行了多长时间),这时候就可以用到头文件ctime里面的clock函数。
clock函数
clock()函数在头文件ctime,使用之前一定要记得include< ctime>(以及实际上传代码的时候记得把clock函数以及其他调试用代码删掉)。看过紫书《算法竞赛入门经典》的话,应该会在27页的时候看到作者用了clock这个函数获取了程序运行了多长时间。但是实际上除了用clock来获取程序运行了多长时间,还可以调用两次clock()并且将两次返回的值相减来得出两次clock函数之间过了多长时间。
比如我自己就写了一个代码,可以计算递归法求斐波那契数列时,耗时是多少。
#include<cstdio>
#include<ctime>
using namespace std;
long long f(long long);
int main(){
for(int i=1; i<=50; i++){
int start, end;
start = clock();
long long ans = f(i);
end = clock();
printf("i:%d f:%lld time:%f\n", i, ans, ((double)end-start) / CLOCKS_PER_SEC);
}
return 0;
}
long