牛客2025秋季算法编程训练联赛3-基础组
(0条未读通知) 牛客2025秋季算法编程训练联赛3-基础组_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ
A 牛牛的DRB迷宫I

对于这个题目,我上来想到的就是用DFS来暴力求解(因为我当时并不清楚DFS的时间复杂度),导致TLE。现在,我需要对DFS在二维矩阵中的时间复杂度做个总结:
对于本题,最坏情况就是所有位置都是’B’,也就是每个位置都有两种选择。
路径长度:从(1,1)到(n,m)需要走(n-1)+(m-1)=n+m-2步
路径数量: $2^{n+m-2} $
时间复杂度:
当n=m=50时:
- 路径长度 = 98步
- 路径数量 ≈ 2^98 ≈ 3.17 × 10^29
超过了10^8的时间复杂度,必然会TLE
总结:DFS在二维矩阵中时间复杂度为 =
在n+m>40时完全不可行。
随后,我又想到以前写过一道动态规划基础题和这个类似,概括下就是从(1,1)开始只能向右或向下走,问走到终点一共有几种方法。有用了这个题的思路,就把本题给写出来了。
B 牛牛的k合因子数

看到这题时候,我本想着直接顺着题目的意思模拟,但是因为时间复杂度问题而写不出来。
初始思路:用筛法把1-n所有合数(非素数)全部标记;循环m次,每次读入一个k,遍历1-n,对于每个数a[i]遍历其所有因子,如果因子是合数就让内计数器+1,如果最后内计数器==k那就让外计数器+1,最后输出外计数器值。
按照这个思路,时间复杂度应该是:以这题的数据规模,必然超时。
我们试着改变下顺序,先把所有的k保存起来(可以使用map键值对来保存,因为n较大),遍历1-n,计算每个数a[i]是t合因子数(判断是否是合数部分可以在循环前初始化筛法),再将键t对应的值++即可。
这样时间复杂度就缩减成了
1 |
|
C 牛牛的Link Power I

使用前缀和将两层循环缩减到一层循环
a[0] a[1] a[2] a[3] a[4]
计算到a[4]贡献时候,a[4]-a[0]+a[4]-a[1]+a[4]-a[2]+a[4]-a[3] = 4*a[4]-(a[0]+a[1]+a[2]+a[3])
若sum[i]表示a[0]+a[1]+…+a[i]
则,对于a[i],其贡献为(i-1)*a[i]-sum[i-1] 注意取模