[JZOJ]2109 清兵线 题解

[JZOJ]2109 清兵线 题解

FIRST 题目大意
给你一些正整数,这些正整数为数轴上若干个点代表的数。现求:假设从原点出发,走m以内(包括m)的距离最多能够访问多少个点,输出m-每个点到达时已经走过的距离的累加和。


NEXT 前置结论
P1
如图所示,首先我们假设数轴上有x,y两点,杀一个士兵的时间是 t i t_i ti
t i ≡ 0 t_i \equiv 0 ti0
不存在从远点跳过点 y y y直接奔向点 x x x存在最优解的可能性


AFTER THAT 解题思路
40分思路
排序+基于前置结论,进行dfs,普通可得40分,再优化一下可能能拿60分
100分思路
排序+动态规划
为了方便取,从小到大排序
既然不可能出现中间为断点的情况
那么我们想要最优解,我们已经死亡的士兵就一定是一个区间
状态易设:
f i , j , 0 f_{i,j,0} fi,j,0表示区间 i i i~ j j j全部已经被杀死了,当前状态杀死的是 i i i(左边)最大值
f i , j , 1 f_{i,j,1} fi,j,1表示区间 i i i~ j j j全部已经被杀死了,当前状态杀死的是 j j j(右边)最大值

可得一个大概的转移式:
f i , j , 0 = m a x ( f i + 1 , j , 0 + m − X , f i + 1 , j , 1 + m − Y ) f_{i,j,0} = max(f_{i+1,j,0}+m-X,f_{i+1,j,1}+m-Y) fi,j,0=max(fi+1,j,0+mXfi+1,j,1+mY)
f i , j , 1 = m a x ( f i , j − 1 , 0 + m − X , f i , j − 1 , 1 + m − Y ) f_{i,j,1} = max(f_{i,j-1,0}+m-X,f_{i,j-1,1}+m-Y) fi,j,1=max(fi,j1,0+mXfi,j1,1+mY)
现在我们就是要求这个 X , Y X,Y X,Y分别是多少(即损耗时间)
我们可以尝试转换一个思路:

即假设你要杀 k k k个人,已经杀了 x x x个,那么你每走 1 1 1步,另外的生命值都-1.即总可以获得的收益减少了 ( k − x ) (k-x) (kx)
t t t步同理 t ( k − x ) t(k-x) t(kx)
带入原式得
X = ( a i + 1 − a i ) ⋅ ( k − j + i ) X=(a_{i+1}-a_i) \cdot (k-j+i) X=(ai+1ai)(kj+i)
Y = ( a j − a i ) ⋅ ( k − j + i ) Y=(a_{j}-a_i) \cdot (k-j+i) Y=(ajai)(kj+i)
由于 K K K没有,那我们直接枚举就完事了。


In The End

  1. 如果a数组里没有原点我们要补一个原点进去一起排序
  2. 要注意 f f f数组的特判和初始值
  3. 如果 j − i + 1 > k j-i+1>k ji+1>k请及时break
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值