失败会消耗体力且没有任何收益,因此最优策略不会去挑战必定失败的关卡。问题转化为:在体力限制下,选出尽可能多的关卡并安排挑战顺序,使得每次挑战时体力不低于该关卡难度。
设已成功挑战 cnt 关,则下一次挑战时的体力为 s−cnt(因为每次成功消耗 1 点体力)。优先挑战难度较大的关卡能让后续的体力保持相对较高,更容易满足难度要求。具体步骤:
冒险家小K即将面对一系列试炼关卡,每个关卡有一个难度值。他拥有初始体力 s。挑战一个关卡需要消耗 1 点体力:如果挑战时当前体力不低于该关卡的难度值,则挑战成功;否则挑战失败,但体力仍会被消耗。小K可以自由选择挑战哪些关卡以及挑战的顺序,未选中的关卡不会消耗体力。
已知所有关卡的数据,你需要计算在最优策略下,小K最多能成功挑战的关卡数量。
注意:失败不会带来任何收益,且会浪费体力,因此最优做法是只挑战能够成功的关卡。安排时,应优先挑战难度较大的关卡,以保证每次成功时剩余的体力尽可能高。
约束条件
第一行包含一个整数 q (1≤q≤105),表示测试用例的数量。接下来对于每个测试用例: 第一行包含两个整数 n 和 s (1≤n≤2×105, 1≤s≤109),分别表示关卡数量和初始体力。 第二行包含 n 个整数,依次表示每个关卡的难度值 (1≤ai≤109)。
对于每个测试用例,输出一行一个整数,表示在该用例中最多能成功挑战的关卡数量。
输入
1
3 5
1 6 3
输出
2
说明
关卡难度为 1、6、3,初始体力 s=5。按照从大到小排序得到 [6,3,1]。
首先尝试难度 6,当前体力 5<6,无法成功;接着尝试 3,5≥3,成功,已成功次数 cnt=1,剩余体力相当于 s−cnt=4;最后尝试 1,4≥1,成功,cnt=2。因此最多能成功挑战 2 个关卡。
输入
3
1 1
2
2 2
1 2
3 4
5 5 1
输出
0
2
1
说明
共有三个测试用例:
2,体力 1<2,无法成功,输出 0。2:2≥2 成功,cnt=1;再挑战 1:1≥1 成功,cnt=2。输出 2。5 均失败,尝试 1 时体力 4≥1 成功。输出 1。输入
1
5 5
1 2 3 4 5
输出
5
说明
n=5,s=5,难度 [1,2,3,4,5]。排序 [5,4,3,2,1]。
依次检查:5≥5 成功,cnt=1;4≥4 成功,cnt=2;3≥3 成功,cnt=3;2≥2 成功,cnt=4;1≥1 成功,cnt=5。所有关卡均可成功,输出 5。
初始体力与最大难度相等,但每次成功后体力递减的节奏恰好与降序难度完全匹配,因此可以全部通过。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册