#3878. 走路(w)

题意

老虎和蒜头是好朋友。

蒜头生活在数轴上,蒜头中学为 $ 0 $ ,蒜头中学旁边有 $ n $ 家餐馆,编号为 $ i $ 的餐馆位置为 $ i,i \in [1,n] $ 。

蒜头打算从蒜头中学所在的 $ 0 $ 号位置出发吃午餐,一开始他有 $ x $ 点行动力,他可以在数轴上左右移动。由于吃得越饱越难移动,如果他吃了 $ a $ 克食物,那么他每移动 $ 1 $ 单位距离(例如从位置 $ 1 $ 移动到位置 $ 2 $ )需要付出 $ a+1 $ 点移动力。

如果某时刻蒜头在位置 $ i \in [1,n] $ ,并且他没有进过第 $ i $ 家餐馆,那么他可以考虑进去吃饭。如果进去吃饭,蒜头会吃下 $ a_i $ 克食物(从而导致移动需要的移动力变大)。

蒜头打算吃得饱饱的,然后走回到蒜头中学(即回到 $ 0 $ )。蒜头想知道在能走回蒜头中学的前提下他最多能吃几克食物。根本不出校门也算可行的方案。

大样例见下发文件中的ex_w2.in和ex_w2.out。

对于所有数据, $ 0 \le a_i \le x $

子任务编号

子任务分值

$ n \le $

$ x \le $

$ 1 $

$ 10 $

$ 12 $

$ 10^6 $

$ 2 $

$ 20 $

$ 500 $

$ 1000 $

$ 3 $

$ 25 $

$ 5000 $

$ 10^6 $

$ 4 $

$ 45 $

$ 100000 $

$ 10^6 $

题解

原来的思路是枚举最远到达的点,然后对前面的点做一个背包,记f[i]为费用为i的最大价值。但这样不太可优化,考虑怎样才能让状态数量少一些。发现费用的上限只有1e6,而对于坐标比较大的点,它使价值的最大增加量很小。考虑如何利用这一性质,是否可以使每个点只计算x/坐标个状态?发现从这个点走回去一定要花费坐标*当前价值,于是把DP的状态改为价值,从后往前做,f[i]表示走到当前点,价值为i的最小费用,这样因为还要带着这些价值回到起点,故只有在x/坐标以内的价值才是可行的,这样效率就优化为 O ( n ∗ l n ( n ) ) O(n*ln(n)) O(nln(n))了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值