2.6 acwing.1214. 波动数列
第五届蓝桥杯省赛C++A组,第五届蓝桥杯省赛JAVAA组
1 | 观察这个数列: |
这题很有难度。(连y总都说有难度)
思路:
本质上是个组合问题。
这题组合维度太多,不能用dfs爆搜。
y总配套详细题解:https://www.acwing.com/solution/content/9223/
注意:数列的下标更换了,但是意义不变。
初始化条件:f[0][0]=1
。
这题数组第二维不是单调变化的,不能去掉一维。
在数论中,余数都是非负的,例如:-2 % 10 = 8.但是C++中会得到负余数,所以要处理一下。
1 | // y总题解 |
如果不交换数组下标,写成这样也是可行(等价)的。
系数和下标之和为n,所以第i项的的系数为n-i。
所以:
f[i][j] = f[i - 1][j - (n - i) * a]
第i个选b:同理:
f[i][j] = f[i - 1][j + (n - i) * b]
四 枚举、模拟与排序
1.枚举
1.1 acwing.1210. 连号区间数
第四届蓝桥杯省赛C++B组,第四届蓝桥杯省赛JAVAB组
1 | 小明这些天一直在思考这样一个奇怪而有趣的问题: |
思路:
考察数据范围10000,知道时间复杂度大致是O(n*logn)比较合理,实在不行O(n^2)也勉强能行。
先写暴力解法,再优化。
排列说明无重复数字。
”不难“发现,连续区间等价于Max - Min = b - a
。因为没有重复数字,刚好填满区间,无空缺。
优化之后,枚举第二重循环同时求最大最小值并判断连续区间。
由于代码量比较小,所以执行的指令较少,时间复杂度的常数比较小,是能AC的。
时间复杂度:O(n^2)。
1 |
|