CSP第二轮是四道编程题,每道100分,怎么才能AC拿满分呢?
上图是题目满分要求。每道题都是有测试点数量、测试点时间、空间限制等要求,就是我们常说的时间复杂度和空间复杂度。
一、时间复杂度
测试点运行时间,不能超过1秒。一般情况下运行次数≤2×10⁸是可以通过的。所以要关注数据范围 n 的值。
比如暴力枚举双重循环,时间复杂度就是 O(n²),也就是n²≤2×10⁸,才可以满足时间的要求。
不同算法的时间复杂度不一样,要牢记各种常见算法的时间复杂度,并且掌握优化顺序。
优化时间复杂度,BAD向AVRAGE优化,AVRAGE向GOOD优化。O(1)最好,O(n!) 最不好。
二、空间复杂度
1、栈内存限制
递归函数出现栈内存溢出(StackOverflow),大部分是因为没有 return,或者在函数中开了很大的数组造成的。
栈内存通常比较有限,为几MB到几十MB。
假设使用int类型数组(每个元素4字节),栈上最多可以分配的内存通常是1~2MB。如果栈的大小限制为2MB,数组为n×m的二维数组。需要满足:
n×m×sizeof(int) ≤ 2×1024×1024(Byte)
那么n=1000,m=500就会占用大约2MB的栈内存。
2、总内存限制
题目中,程序运行的内存限制512MB。那么
512MB=512×1024×1024=536870912(Byte)
如果是 int 类型,也就意味着
SIZE=536870912÷4=134217728
所以如果二维数组n×m≥10⁹ ,请使用向量vector 。
比如图中节点数和边数在构造G时超出了范围,就不要使用邻接矩阵,使用邻接表来完成。
三、数据类型范围
数据类型通常指的是用int,还是long long?
对于上面这个测试点的数据,因为n≤10⁹,所以 int 类型没问题。
但是下面这个测试点数据就不能使用 int 类型,因为vᵢ×aᵢ的结果可以达到10¹⁰,int类型就会溢出,所以用 long long 。
分析题目的时候注意 n 的值,用哪种数据类型(不溢出)、哪种算法(小于1秒)、哪种数据结构(满足内存限制)。