怎么七月了?六月的只写了一道题捏。
俺寻思能行。
为什么大家都切那么快捏。
显然 一定是 数组的一个前缀和。假设 ,剩下的等价于处理初值为 0 且 的子问题。我们需要在 的时间内解决。
先考虑能不能 。你枚举它最后一个会把它提到 0 的位置,后面的就是后缀和,所以后面那坨的答案就是 。维护后缀和最大值就是 了。
它为什么是对的?首先 rating 在任意时刻都不会小于 0,所以当当前 rating 为 0 时它就是对的;当 rating 大于 0 时,答案会被算小,但这证明我们可以往前找到第一个 rating 等于 0 的位置,且从那到这一段中的变化量为正,在那个点我们就可以得到这个正确答案。
这是一个 的做法。但它常数极小,加上火车头可以跑进 0.8 秒。
容易发现在最后得到的序列中从左往右第 个 1,一定是初始序列中从左往右第 个 1,因为它只能相邻交换。所以,一种方案需要走的最少步数,就是对应 1 的位置之差的和。定义 表示前 个格子,有 个 1,总共需要走 步,有多少满足条件的序列,转移就是枚举当前位置放 0 还是 1。
容易发现对于那些没走满 步的方案,如果存在空位,那么你可以“左右横跳”来凑满 步。一次最少多走两步,所以多走的步数是 2 的倍数。记 1 的个数为 ,最终答案就是 。
第一维可以压掉,时间复杂度 。这样过不了,但是你发现 0 和 1 是等价的,所以上述定义改为 0 也是一样的,你可以选个数少的来 dp。实现再优秀一点就可以跑进 0.8 秒。
但是这显然不是出题人的意图,考虑再次优化。假设第 位的前缀和为 ,那么这一位最终的前缀和 只可能取在 ,因为不论是要把前 个数中的 个 1 移出还是把后面的 个 1 加入前 个数都至少需要 次操作。时间复杂度 ,实测只用了 0.1 秒。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现