电话18065871965

邮箱qidianxingcheng@163.com

地址三明市三元区乾龙新村69幢B座2楼

信息学奥赛CSP第二轮AC必备,数据范围须知

2024年10月23日 436

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秒)、哪种数据结构(满足内存限制)。