原题链接
解题思路
设当前可能的树高范围为 [L,R]。
初始时,树高可能为任意正整数,所以令 L=1,R=∞。
1. 事件 1
一只属性为 a,b 的蜗牛声称花了 n 天爬树。
设符合条件的树高范围为 [Hmin,Hmax]。
前 n−1 天,白天上爬 a 米,晚上下滑 b 米,每天爬 a−b 米;最后 1 天最多爬 a 米。所以 Hmax=(a−b)(n−1)+a 米。
爬了 n 天意味着第 n−1 天没有爬到树顶,同理 n−1 天最多爬 (a−b)(n−2)+a 米。所以 Hmin=(a−b)(n−2)+a+1 米。
计算 [L,R] 和 [Hmin,Hmax] 的交集,如果为空,说明该信息有冲突,直接忽略;否则树高范围需要同时满足这两个集合,即将 [L,R] 设为两者的交集。
2. 事件 2
一只属性为 a,b 的蜗牛询问爬树所需天数。
当树高为 h 米时,设所需天数为 n 天。
最后 1 天爬 a 米,还剩 h−a 米;前面每天爬 a−b 米,需要 ⌈a−bh−a⌉ 天。所以 n=⌈a−bh−a⌉+1 天。
显然,当 h=L 时,所需天数最少;当 h=R 时,所需天数最多。如果两者相等,便可以得出精确的答案。
3. 注意事项
- 在事件 1 中,当 n=1 时,最小树高 Hmin=1 米。
- 在事件 2 中,显然所需天数至少为 1 天。
- 使用
double
类型,可能会导致精度丢失。建议根据以下公式手写取上整函数:
⌈ba⌉=⌊ba+b−1⌋
参考代码