法一:题面给出了这些数,容易想到调和级数。于是尝试对于每个,我们取找出升级的每段(也就是对怪物序列进行划分,每一段的等级相同,相邻两段等级相差一),然后看这篇题解;所以以后遇到处理这种式子就可以想根号算法
法二:转换考虑对象。考虑一个怪兽什么时候会被打到。一个感性的想法就是越大,需要打的怪兽就越多,于是到同一个怪兽的等级就越低,怪兽就会从逃跑变成应战。于是有一个很自然的想法,设表示第个怪兽应战的最低的。求的时候,只需二分,并查找 ~ 中的的个数,设为,如果,那么这个就可以,否则就不行。上述过程可以用树状数组优化,时间复杂度为两个(当然遇到树状数组加二分可以想到树状数组加倍增,将时间复杂度优化为一个);然而我考试的时候是想到这里的,但是没有敢写,为啥?因为有另一种想法,就是越大,应战的怪兽就越多了,可能会抵消增大的影响,导致升级还是不会更慢(甚至更快),也就是说没有单调性(从数学表达式也可以看出来,增大,肯定也增大的),那么上述过程就错了;这个时候,考场就直接写嘛,这代码40行太好写了吧,这场rating纯属白给。重新做的时候想出来了单调性证明方法了。下面给出单调性证明:设,那么当我们等级变成的时候,肯定是前者所在的怪兽的下标更大,此时我们将所有等级为的怪兽移除(相当于这些怪兽没有用了),然后再计算两种情况下,我们等级为的地方。不难知道,此时对于,下标更大了,而且由于,说明我们对怪兽的需求数量也更大了,于是可以知道升到级的坐标肯定会更大。其余情况同理可证
法三:法二给出了单调性证明。现在考虑只求一个怪兽的,那么直接二分,并且每次暴力循环,时间复杂度为;如果现在要对个怪兽求解,时间复杂度就是;遇到这种“单个二分没问题整个二分就超时”就可以上整体二分了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2023-08-18 阶乘分解