小黄人星球被入侵,小黄人们拿起武器奋力抵抗,现在小黄人面对的是m个入侵者,每个入侵者的血量均为a . 小黄人拿出了祖传的武器,它的攻击范围为b,一次可以至多使b个入侵者的血量降低1 . 当入侵者的血量降到 0的时候即被杀死。现在小黄人有n次攻击机会,他想知道,他至多可以杀多少入侵者。 输入格式: 第一行一个整数T , 代表数据组数。 接下来T 行,每行四个整数,n,m,a,b含义如描述所述 1<=n,m,a,b<=1e9 输出格式: 对于每组数据,输出一行一个整数,最多能击败的入侵者数量
时间: 2024-02-13 18:04:10 浏览: 45
这是一道数学题,可以先算出每次攻击后,小黄人能杀死的最多入侵者数量,然后根据小黄人攻击的次数,计算最多能击败的入侵者数量。
具体做法如下:
1. 计算每次攻击后,小黄人能杀死的最多入侵者数量
设每次攻击后小黄人杀死了 x 个入侵者,则有:
x = min(m, n * b)
其中,n * b 表示小黄人最多能够攻击的入侵者数量,min(m, n * b) 表示小黄人最多能够杀死的入侵者数量,因为小黄人攻击的次数有限,不能超过总的入侵者数量。
2. 计算最多能击败的入侵者数量
设小黄人一共杀死了 y 个入侵者,则有:
y = x + (n - 1) * min(m - x, b * x)
其中,n - 1 表示小黄人攻击的次数,min(m - x, b * x) 表示剩余入侵者中最多能够杀死的数量,因为小黄人每次攻击后,入侵者的数量会减少,所以剩余入侵者中最多能够杀死的数量也会发生变化。
根据以上公式,可以写出如下的 C++ 代码:
```cpp
#include <iostream>
using namespace std;
long long calc(int n, int m, int a, int b) {
long long x = min(m, (long long)n * b); // 每次攻击后能杀死的最多入侵者数量
long long y = x + (n - 1) * min((long long)m - x, x * b); // 最多能击败的入侵者数量
return y / a; // 返回能杀死的入侵者数量
}
int main() {
int T;
cin >> T;
while (T--) {
int n, m, a, b;
cin >> n >> m >> a >> b;
cout << calc(n, m, a, b) << endl;
}
return 0;
}
```
希望能够帮助到您!
阅读全文