从逐次减法到高效除法
题目描述:
给定初始值 N,以及 M 种操作,每种操作 (a, b),表示每次操作必须满足 N >= a,然后 N 会减少 b。要求计算最多可以执行多少次操作,并更新 N。
思路与推导:
操作描述:
每个操作(a, b),表示:- 只有当
N >= a时,才能进行操作。 - 每次操作会将
N减去b,直到无法继续执行为止。
- 只有当
最大操作次数的推导:
假设对于某个操作a和b,我们希望计算最多可以执行多少次该操作。由于每次操作将
N减少b,为了保证N始终大于等于a,我们可以得到以下条件:其中
t为最大执行次数。由此可以得到:这意味着最多可以进行 $t = \left\lfloor \frac{N - a}{b} \right\rfloor$ 次操作。
为什么要加 1?
- 因为
N在减了t次之后还是大于或等于a的还可以再进行一次操作,这次减了b了之后,N小于a,不会再进行下一次(a,b)操作了
所以,最终的最大操作次数是:
- 因为
更新 N:
每次操作执行t次后,N会减少t * b。更新后的N为:继续进行下一个操作,直到遍历所有操作。
示例:
输入:
1 | 100 2 |
输出:
1 | 27 |
解释:
- 第一个操作:
a = 20, b = 3,计算(100 - 20) / 3 + 1 = 27,执行 27 次,更新N = 100 - 27 * 3 = 19。 - 第二个操作:
a = 50, b = 5,由于N = 19小于50,跳过该操作。 - 最终输出
cnt = 27。
总结:
通过优化循环,使用数学公式一次性计算每个操作的最大执行次数,避免了逐次减法,从而提高了程序效率。核心考察了通过数学推导解决动态问题和优化计算时间的能力。