AtCoder Beginner Contest 162 题解

传送门:
https://atcoder.jp/contests/abc162/tasks

AC 代码:
https://atcoder.jp/contests/abc162/submissions/me?f.Task=&f.LanguageName=&f.Status=AC&f.User=HinanawiTenshi

D

枚举两维 i,j,然后利用前缀和统计第三维 k,判一下 i+k 是否等于 2j 即可。

E

倒序枚举 gcd 即可。

F

dp,但我觉得我写的很丑
题目要求选出 n2 不相邻的数使得值和最大,事实上不相邻 + 取一半的数这两个限制已经让解空间分布得很小。

注意到当 n 为偶数时最多“跳”一次,具体可以看下图:
n=6 时:

约定 _ 为未选取的,A 为选取的。

那么所谓的“跳”就是:

这里是第 2A 和第 3A “跳”了一格。
A _ A _ _ A

这里是开头“跳”了
_ A _ A _ A

这里则是结尾“跳”了
A _ A _ A _

显然,开头结尾的“跳”的状态可以直接手写出来(也许可以有更好的方法处理开头结尾,反正我写的很丑

下面考虑中间状态转移的情况:

所以我们用 f(i,op) 表示前 i 个跳/没跳的最大收益。

有:

f(i,0)=f(i2,0)+wi

f(i,1)=max(f(i2,1),f(i3,0))+wi

奇数情况类似,只不过更麻烦而已。

posted @   HinanawiTenshi  阅读(67)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示