此题其实就是一个经典的二分想法,当选定了天数之后,不难知道想要得到最大的成长值只需要将前面的天数的成长值和翻倍卡分别排序,大成长值使用大翻倍卡,此即为最大的成长值,并且当一个天数满足要求后,那么比他大的天数均满足要求,利用这个性质可以对天数进行二分,详情见代码
import java.util.*;
class Main {
public static void main(String[] args) {
会员体系分为大众、白银、黄金、铂金和钻石会员五个等级,等级由成长值决定,成长值越高,等级也就越高,也能够享受更多的会员权益。这天,小塔发现可以通过完成每日任务的方式快速获得成长值提升等级!一共有n个任务,每天都会解锁一个新的任务,第i个任务达成后可以获得ai点成长值奖励。为了鼓励用户参与任务,在开始任务之前,还可以进入“挑战”模式,即预先设置自己能够坚持的天数x,在完成挑战后,可以得到前张奖励翻倍卡,你可以自由选择翻倍卡的使用顺序,使得每一天的成长值奖励翻倍,第i张翻倍卡可以将任务完成后的成长值奖励乘以bi倍,例如:第一天任务奖励1点成长值,第二天任务奖励2点成长值,奖励一张四倍翻倍卡和一张两倍翻倍卡,那么最少可以得到8点成长值,最多可以得到10点成长值。小塔比较偷懒,他想要找到最少需要坚持的天数,使得自己能够获得至少m点成长值。
第一行输入两个整数n和m(1≤n≤105;1≤m≤1012)代表任务总数量和需要的成长值数量。第二行n个整数 a1,a2,..,an(0≤ai≤103)代表每一个任务奖励的成长值点 第三行n个整数b1,b2,..,bn(1≤bi≤103)代表按顺字摆放的翻倍卡的面值
在一行输出一个整数,代表最少坚持的天数;若永远无法达到目标,则直接输出−1
输入
5 20
1 2 3 4 5
4 2 3 5 10
输出
3
输入
2 20
1 2
4 2
输出
-1
说明
塔塔可以挑战坚持三天,在完成挑战后他会获得前三张翻倍卡。在第一个关卡使用面值为2的翻倍卡,获得1×2=2金币。在第二个关卡使用面值为3的翻倍卡,获得2×3=6金币。在第三个关卡使用面值为4的翻倍卡,获得3×4=12金币。由于2+6+12=20≥20,因此他塔塔可以达成目标。可以证明更少的关卡无法满足条件 注意,如果只计划坚持三天,则只能携带前3张翻倍卡
本题属于以下题库,请选择所需题库进行购买