有n个气球,每个气球都有一个坚韧度,牛牛有一把全屏武器,可以使每一个气球的坚韧度都下降b(坚韧度不会为负数),特别的:每次释放武器的时候,牛牛可以选择一个气球,使得这个气球多承受a点伤害。 牛牛想知道,最少释放几次武器,可以使得所有气球的坚韧度都变成0呢?
第一行三个整数n,a,b。 第二行n个空格隔开的整数,第 i_th 个数表示第i个气球的坚韧度。 1≤ n≤10^5 。其余所有整数都在 [1,10^9] 范围内。
一个整数表示答案。
3 1 2 1 4 5
2
考点:二分
数据规模 n ≤ 1e5 | 限制 1 秒 / 256MB | 标准输入输出
推荐方向:二分
本题切入点
答案(施法次数)具有单调性,二分答案后用 check 判定「给定次数能否打完全部气球」。
把「求最优值」转化为「判定某值是否可行」,用单调性二分逼近答案。
思路框架(二分 通法 · 非本题专属)
实现要点:模板:while (lo < hi) { mid = (lo+hi)/2; if (check(mid)) hi = mid; else lo = mid+1; } 求最小可行值。
复杂度:时间 O(check 的代价 × log(答案范围)) | 空间 O(1)
该范式的通法易错点
对照本题
样例 1:输入 3 1 2 / 1 4 5 → 输出 2
第一次释放选择对第三个气球多承受1点伤害,三个气球的坚韧度变成:0 2 2 。第二次释放后所有气球的坚韧度都为0。
解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:贝壳找房2023届校招算法卷3。