希望更好的阅读效果?点这里
题目:
描述
有一个英雄,初始生命值是 h p hp hp(生命值无上限),在接下来的 n n n ( n ≤ 500 n \le 500 n≤500)秒内,每秒会受到一次伤害,第 i i i 秒受到的伤害值为 a [ i ] a[i] a[i]( 1 ≤ ∣ a [ i ] ∣ ≤ 1000 1 \le |a[i]| \le 1000 1≤∣a[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 hp≤0 时视为死亡,问这个英雄存活下来的前提下, 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 T≤5 与 n ≤ 500 n \le 500 n≤500 是很小的,但是真的有那么容易吗?
设 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