A 斐波那契与7
简要题意:求斐波那契数列的第1至202202011200项中,有多少项的个位是7。
解题思路:
- 直接暴力计算所有项不可行,因为数据量过大。
- 通过打表观察发现个位数每300项会出现循环规律。
- 预先计算循环周期内个位为7的项数(40个),然后计算完整周期数和剩余项数。
代码实现:
|
|
B 火柴棒数字
简要题意:用300根火柴棒拼出最大的整数。
解题思路:
- 要使数字最大,首先位数要尽可能多。
- 统计各数字的火柴消耗,优先使用消耗少的数字(1消耗最少,但0不能作为前导)。
- 发现可以正好用9,7,5,4,3,2,1各10个拼出最大数字。
代码实现:
|
|
C 取模
简要题意:给定n,m,判断是否存在不同的x,y满足1≤x<y≤m且n mod x = n mod y。
解题思路:
- 使用鸽巢原理,若n mod i必须等于i-1才能避免重复。
- 这个条件非常严格,实际只需检查前几项即可快速判断。
代码实现:
|
|
D 最大公约数
简要题意:求满足gcd(x,y)=k的数对个数。
解题思路:
- 使用莫比乌斯反演来高效计算区间内的合法数对。
- 预处理莫比乌斯函数,然后通过分块计算加速。
代码实现:
|
|
E 数组个数
简要题意:构造满足特定条件的数组方案数。
解题思路:
- 枚举前两个数,然后动态规划计算后续数的可能情况。
- 检查每个位置的约束条件并累加合法方案。
代码实现:
|
|
F 六六大顺
简要题意:计算特定数列的和。
解题思路:
- 发现数列有数学规律,可通过公式直接计算。
- 使用快速幂优化大数运算。
代码实现:
|
|
G 环境治理
简要题意:通过调整道路灰尘使总灰尘达标的最小天数。
解题思路:
- 二分答案结合Floyd算法计算最短路径。
- 检查中间结果是否满足约束条件。
代码实现:
|
|
H 宝石收集
题目分析
给定一个有向图,每个节点标记为红宝石(‘0’)或蓝宝石(‘1’)。我们需要从某些节点出发,收集宝石,使得在路径上收集的 红宝石总数 和 蓝宝石总数 的较小值(即 min(红宝石和, 蓝宝石和)
)最大化。
解题思路
- 强连通分量(SCC)缩点
- 使用 Tarjan 算法 求出所有强连通分量(SCC),并将每个 SCC 缩成一个点。
- 缩点后,原图变为 有向无环图(DAG),便于后续动态规划(DP)处理。
- 统计 SCC 内的宝石数量
- 对于每个 SCC,计算其包含的 红宝石数量(
red[i]
) 和 蓝宝石数量(blue[i]
)。
- 对于每个 SCC,计算其包含的 红宝石数量(
- 动态规划(DP)求解最优解
- 定义
dp[i][j]
表示在 SCCi
时,收集了j
个蓝宝石时,能得到的 最大红宝石数量。 - 转移方程:
- 若当前 SCC
i
指向 SCCy
,则更新dp[y][j + blue[y]] = max(dp[y][j + blue[y]], dp[i][j] + red[y])
。
- 若当前 SCC
- 最终答案:遍历所有
dp[i][j]
,求min(dp[i][j], j)
的最大值。
- 定义
|
|
I 图书借阅
简要题意:优先队列贪心问题(待补充详细思路)
J 替换字符
简要题意:高效处理字符串的区间字符替换。
解题思路:
- 使用字典记录每个字符的位置索引。
- 通过二分查找快速定位需要修改的区间。
- 批量更新字符位置信息。
代码实现:
|
|