[ZR] WI

source:zr 二十联测 day16 B

题意

给定 n 个数 ai

每次你需要花费 c 在剩余的数中均匀随机获得一个数,你可以选择留下这个数,此时游戏结束且得分为该数值;否则将这个数扔掉(但不放回),然后游戏继续。

求最大期望。要求时间复杂度 O(n)

分析

ai 降序排序。

首先需要发现,我们的最优策略一定形如 t1,t2,,tk,表示我在第 i 次游戏时抽到了下标 ti 的数就见好就收,否则把数扔掉。其次一定有 ti 单调不升。

考虑设计一个暴力 DP。设 fi,j 表示剩下 i 个数,当前极长的没被删的前缀长度为 j 的最大期望。由于 ti 单调不升,所以在 i1 决策完之后,>ti1 的那些数如果抽到是肯定要丢的。转移考虑抽到的是肯定要丢的还是可以决策留不留的,转移方程:fi,j=ijifi1,j+k=1jmax(ak,fi1,k1)ic

裸实现时间复杂度 O(n3)。由于状态数已经达到了平方级别,所以考虑怎么压状态。

考虑到对于那些一定要丢的数,我们并不关心具体选了哪个,所以我们不妨这么考虑:如果删了一定要丢的数,钦定它选了最小的那个数,据此设计 DP 状态为 fi 表示剩了 i 张牌的最大期望。转移考虑枚举 ti=pfi=ipifi1+i=1psii。复杂度平方。

考虑优化。发现 p 指针右移造成的增量为 fi1ap,由于 ap 单调,所以我们实际上只需要找到第一个 fi1ap 即可。若采用二分复杂度带老哥,但是发现 fi 本身也是单调的,据此可以双指针,复杂度线性。

作者:dcytrl

出处:https://www.cnblogs.com/dcytrl/p/18535463

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   dcytrl  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示