Level Up

法一:题面给出了k,2k,3k这些数,容易想到调和级数。于是尝试对于每个k,我们取找出升级的每段(也就是对怪物序列进行划分,每一段的等级相同,相邻两段等级相差一),然后看这篇题解;所以以后遇到处理i=lr[ai>x]这种式子就可以想根号算法

法二:转换考虑对象。考虑一个怪兽什么时候会被打到。一个感性的想法就是k越大,需要打的怪兽就越多,于是到同一个怪兽的等级就越低,怪兽就会从逃跑变成应战。于是有一个很自然的想法,设f[i]表示第i个怪兽应战的最低的k。求f[i]的时候,只需二分k,并查找1 ~ i1中的fk的个数,设为cnt,如果cntk+1ai,那么这个k就可以,否则就不行。上述过程可以用树状数组优化,时间复杂度为两个log(当然遇到树状数组加二分可以想到树状数组加倍增,将时间复杂度优化为一个log);然而我考试的时候是想到这里的,但是没有敢写,为啥?因为有另一种想法,就是k越大,应战的怪兽就越多了,可能会抵消k增大的影响,导致升级还是不会更慢(甚至更快),也就是说没有单调性(从数学表达式cntk也可以看出来,k增大,cnt肯定也增大的),那么上述过程就错了;这个时候,考场就直接写嘛,这代码40行太好写了吧,这场rating纯属白给。重新做的时候想出来了单调性证明方法了。下面给出单调性证明:设k1>k2,那么当我们等级变成2的时候,肯定是前者所在的怪兽的下标更大,此时我们将所有等级为1的怪兽移除(相当于这些怪兽没有用了),然后再计算k1,k2两种情况下,我们等级为2的地方。不难知道,此时对于k1,下标更大了,而且由于k1>k2,说明我们对怪兽的需求数量也更大了,于是可以知道升到2级的坐标肯定会更大。其余情况同理可证

法三:法二给出了单调性证明。现在考虑只求一个怪兽的f,那么直接二分,并且每次暴力循环,时间复杂度为O(nlogn);如果现在要对n个怪兽求解,时间复杂度就是O(n2logn);遇到这种“单个二分没问题整个二分就超时”就可以上整体二分了

posted @   最爱丁珰  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2023-08-18 阶乘分解
点击右上角即可分享
微信分享提示