计算量限制
不懂算法复杂度可以去搜一下。
通过题目给出的数据量推算你的算法复杂度应该是多少。
下面n表示数据量:
比如,O(n) 表示你代码要执行n次,就是数据有多少个你的代码要执行多少次;
O(log n) 表示数据量有n个,你的代码要执行log n次。
蓝桥杯一般能承受 1 0 9 10^9 109次运算。如果你的算法要运行 1 0 9 10^9 109次以上,除非题目允许较长的运行时间,否则是拿不到满分的!
顺便一提,蓝桥杯内存现在基本上都是256mb,大概可以开辟
<
67108864
<67108864
<67108864个的int32
数组。不要真开这么多,开辟空间也是有运算量的。
所以写完代码最好计算一下算法的时间和空间复杂度,这可以判断算法的可行性!
通过数据量思考解题
通过数据量推导的出算法复杂度,可以帮助你推导出大概使用什么算法做题。
根据本人经验,题目给出的数据量( n n n)对应的算法大概有如下关系:
- n < 18 n<18 n<18,大概率要使用状态压缩技巧;
- n < 11 n<11 n<11那大概率是全排列问题,要使用回溯+深度优先等;
- n < = 1 0 4 n<=10^4 n<=104大概率可以使用暴力枚举、动态规划;
- n < = 1 0 6 n<=10^6 n<=106,大概率要使用排序、二分和线性复杂度的算法,即为 O ( n ∗ l o g n ) O(n*logn) O(n∗logn)复杂度的算法。暴力已经拿不到满分了;
- n < = 1 0 9 n<=10^9 n<=109就思考线性算法,如双指针、前缀和与差分、二分,最好别;
- n n n继续增大就要思考 O ( l o g n ) O(log n) O(logn)复杂度的算法,比如二分、数学公式。
看到上面的对应关系你可能疑惑为什么1,2要使用复杂度如此之高的算法?
因为蓝桥杯要考倒你,大概率不会出那么简单的题。
整理后表格
数据量 | 大概率要使用的算法 |
---|---|
n < 18 n<18 n<18 | 状态压缩 |
n < 11 n<11 n<11 | 全排列问题:回溯 |
n < = 1 0 4 n<=10^4 n<=104 | 暴力枚举、动态规划 |
n < = 1 0 6 n<=10^6 n<=106 | 排序、二分、线性复杂度 |
n < 1 0 9 n<10^9 n<109 | 双指针、前缀和与差分、二分 |
/ | 二分、数学公式 |