[二分+DP]魔棒

希望更好的阅读效果?点这里

题目:

描述

有一个英雄,初始生命值是 h p hp hp(生命值无上限),在接下来的 n n n n ≤ 500 n \le 500 n500)秒内,每秒会受到一次伤害,第 i i i 秒受到的伤害值为 a [ i ] a[i] a[i] 1 ≤ ∣ a [ i ] ∣ ≤ 1000 1 \le |a[i]| \le 1000 1a[i]1000)。这个英雄有一个道具"魔杖",魔杖的初始能量为 0 0 0 ,每受到 1 1 1 次伤害,积攒 1 1 1 点能量。在英雄受到伤害后,可以立即释放魔棒中的能量,恢复 15 × [ 能 量 点 数 ] 15 \times [能量点数] 15×[] 的生命值,且魔棒的点数清零。释放能量有施法间隔 c d cd cd c d cd cd 是正整数),即相邻的两次释放的时间间隔至少有 c d cd cd 秒。任何时刻当 h p ≤ 0 hp \le 0 hp0 时视为死亡,问这个英雄存活下来的前提下, c d cd cd 的值最大可以是多少?注意,若 a [ i ] a[i] a[i] 为负,受到"伤害"后实际上生命值是增加的,魔棒仍然积攒能量。

输入

第一行一个整数 T T T ,表示测试数据的组数。对于每组测试数据:
1 1 1 行两个正整数 n , h p n,hp n,hp ,含义如题目所述。
2 2 2 n n n 个整数,分别是 a [ 1 ] ∼ a [ n ] a[1] \sim a[n] a[1]a[n]

输出

对每组测试数据输出一行包含一个数,即最大的 c d cd cd c d cd cd 是一个正整数。如果 c d cd cd 没有上限,输出"No upper bound."(不含双引号);如果无论如何都不能存活,输出 − 1 −1 1

分析:

多组数据 T ≤ 5 T \le 5 T5 n ≤ 500 n \le 500 n500 是很小的,但是真的有那么容易吗?

c d cd cd 最大为 x x x ,如果 c d > x cd>x cd>x 英雄不能存活,否则就能够存活。于是可以二分 c d cd cd 的值,如果 1   n 1~n 1 n h p > 0 hp>0 hp>0 ,则把 m i d mid mid 调大。否则就调小。

像我这种蒟蒻差分约束系统显然是不会的,只会用DP写check函数。

f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k] 表示到第 i i i 秒末,能量点数为 j j j ,释放了 k

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值