2023牛客寒假算法基础集训营6
2023牛客寒假算法基础集训营6
比赛地址: 2023牛客寒假算法基础集训营6_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)
部分题解: A B C D F G H I
A
思路 : 普通签到题, 比较大小
题目 : A_2023牛客寒假算法基础集训营6 (nowcoder.com)
代码 : 代码查看 (nowcoder.com)
B
思路 :
预处理 + 二分查找 + 筛约数
先预处理出来每个 \(a_{i}\) 的约数, 对于每个约数, 把其所在的所有 \(a_{i}\) 的下标存起来
对于每次操作:
- 修改: 添加 \(x\) 的同时, 把 \(x\) 的约数也处理存起来
- 讯问: 二分查找 \(a_{x}\) 作为约数下的下标里, 第一个大于 \(x\) 的位置, 然后取其到最后的个数就行
题目 : B_2023牛客寒假算法基础集训营6 (nowcoder.com)
代码 : 代码查看 (nowcoder.com)
C
思路 :
贪心 + 模拟
为了尽可能让合起来的数最大, 就要尽可能让大的数被加的次数多, 也就是让大数尽可能往序列中间靠
当 n = 5 时, 如果序列为 [1, 4, 3, 2] 则有 [5, 7, 5], 那么 4 就会被利用两次, 那么这时 7 最大 则有 [12, 12], 那么 7 也会被利用两次, 实现利用最大化 如果序列为 [4, 1, 3, 2] 则有 [5, 4, 5], 那么 4 就只会被利用一次 // 所以就需要让大数往中间靠, 以此得到最大值
题目 : C_2023牛客寒假算法基础集训营6 (nowcoder.com)
代码 : 代码查看 (nowcoder.com)
D
思路 :
贪心 + 差分 + 前缀和
在字符串 \(s\) 里, 对于任意的
u
或d
, 找到参与构成udu
最多一个(不唯一), 并把它改掉遍历字符串, 当
s[i] == 'd'
时,
- 让
l[i]
为s[i]
左边u
的个数,r[i]
为s[i]
右边u
的个数
s[i]
参与构造udu
的个数d[i] += l[i] * r[i]
s[0 ~ i]
间u
参与构造的个数d[j] += r[i]
s[i ~ n]
间u
参与构造的个数d[j] += l[i]
因为一个一个加会超时, 所以用差分, 最后加和判断
题目 : D_2023牛客寒假算法基础集训营6 (nowcoder.com)
代码 : 代码查看 (nowcoder.com)
F
思路 :
贪心 + 预处理 + 二进制
对于每次操作, 优先对最大值进行操作
因为数据范围很大, 可以预处理进行第 \(1, 2, 3 ... cnt\) 次操作后数组 \(a\) 的最大值, 直到最大值为 \(1\) 就停止预处理, 并记录一下此时的操作数 \(cnt\).
对于每次询问, 如果 \(k > cnt\) 直接输出 \(1\), 其余情况就输出预处理的值
题目 : F_2023牛客寒假算法基础集训营6 (nowcoder.com)
代码 : 代码查看 (nowcoder.com)
G
思路 :
可以把数分为正数和负数(0 正负都行)
- 令 \(L\) 为负数个数, \(R\) 为非负数的个数
- 如果此时 \(L \ge 2, R \ge 2\) , 那就取 \(max(负数最大的两个数相乘, 非负数最大的两个数相乘)\)
- 如果此时 \(L = 1\)
- 且 \(R = 0\), 无数可取
- 且 \(R = 1\) , 直接取相乘
- 且 \(R \ge 2\) , 取非负数最大的两个数相乘
- 如果此时 \(R = 1\) (同理)
- 且 \(L = 0\), 无数可取
- 且 \(L = 1\) , 直接取相乘
- 且 \(L\ge 2\), 取负数最大的两个数相乘
题目 : G_2023牛客寒假算法基础集训营6 (nowcoder.com)
代码 : 代码查看 (nowcoder.com)
H
思路 : 普通数学题
题目 : H_2023牛客寒假算法基础集训营6 (nowcoder.com)
代码 : 代码查看 (nowcoder.com)
I
思路 :
最短路 + BFS
可以求出从 \(1 - n\) 最短的路数 \(d\) , 如果 \(d \le m + 1\) , 那么就可以边走边消灭自己走过的路, 答案就为 \(d\); 否则就是 \(d = m\), 那么就得先消耗第一条路的时间, 然后才能边走边消灭自己走过的路
题目 : I_2023牛客寒假算法基础集训营6 (nowcoder.com)
代码 : 代码查看 (nowcoder.com)