当你正在散步时,突然出现了 N 只魔物。每只魔物拥有一个称为体力的数值,第 i 只魔物出现时的体力为 hi。当某只魔物的体力降至 0 以下时,它会立刻消失。
幸运的是,你是一名熟练的魔法师,能够使用爆炸攻击魔物。每次爆炸时,你可以按以下方式减少魔物的体力:
- 选择一只仍然存活的魔物,以它为中心引发爆炸。爆炸中心的魔物体力减少 A,其余所有魔物的体力各自减少 B。其中 A 和 B 是已知的常数,且 A>B。
要彻底消灭所有魔物,最少需要引发多少次爆炸?
输入格式
输入以如下格式给出。
N A B h1 h2 … hN
输出格式
输出消灭所有魔物所需的最小爆炸次数。
输入输出样例
输入 #1
4 5 3 8 7 4 2
输出 #1
2
输入 #2
2 10 4 20 20
输出 #2
4
输入 #3
5 2 1 900000000 900000000 1000000000 1000000000 1000000000
输出 #3
800000000
说明/提示
限制
- 输入中的所有数均为整数。
- 1≤N≤105
- 1≤B<A≤109
- 1≤hi≤109
样例解释 1
可以通过以下方式,在 2 次爆炸内消灭全部魔物:
- 首先,以体力为 8 的魔物为中心引爆。四只魔物的体力分别变为 3,4,1,−1,最后一只魔物消失。
- 接着,再以剩余体力为 4 的魔物为中心引爆。剩下的三只魔物体力分别变为 0,−1,−2,于是全部消失。
样例解释 2
必须分别以每只魔物为中心进行 2 次爆炸,总共需要 4 次爆炸。
【代码示例】
#include <bits/stdc++.h>
using namespace std;
int n, a, b, h[100005];
bool cmp(int x, int y) {
return x > y;
}
int ceil(int x, int y) {
if (x % y == 0)
return x / y;
else
return x / y + 1;
}//向上取整
bool check(long long x) {
long long cnt = 0;
for (int i = 1; i <= n; i++) {
if (h[i] <= x * b)
continue;
//若x次伤害为B的爆炸可以把他消灭把它消灭
cnt += ceil(h[i] - x * b, a - b);
//用伤害为A的爆炸将他消灭
}
return cnt <= x;
}
int main() {
cin >> n >> a >> b;
for (int i = 1; i <= n; i++)
cin >> h[i];
long long l = 0, r = 1e18, ans = -1;
while (l <= r) {
long long mid = l + (r - l) / 2;
if (check(mid)) {
r = mid - 1;
ans = mid;
} else {
l = mid + 1;
}
}
cout << ans;
}