由于特殊原因以下题面做加密处理,懂得都懂。
混元形异太极门掌门人马*国强势入驻王者峡谷,其独门绝技闪电伍连鞭,连续五次攻击不仅伤害爆炸而且还可暴击,一举成为AD杀手。
马同志在不出任何装备的情况下每次的伤害为 A ,对面AD的血量为 B 。现在马同志打算出装了,他打算出全暴击装,那么他想知道,当暴击率达到多少的时候能有 90% 的概率秒掉AD?当血量为 0 即可判断为死亡。
$$
69岁的老同志请您帮他算一下最少要多少的暴击率能有 90% 的概率秒掉AD。
注意,当暴击率为 P 时,每次攻击都有 P 的概率暴击。本题的暴击伤害为普通攻击的 2.0 倍。
输入格式:
第一行给出样例组数 t(1<=t<=100)
之后的 t 行,每行给出两个正整数 A,B(1<=A,B<=108)
输出格式:
对于每组输入数据,如果AD能有 90% 的概率被秒掉了,请在一行内输出最小的暴击率,保留两位小数(四舍五入);否则请在一行内输出"HZWZ",不带引号。
输入样例0:
在这里给出一组输入。例如:
4
2 20
2 21
2 10
2 15
输出样例0:
在这里给出相应的输出。例如:
97.91
HZWZ
0.00
75.34
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
const double eps = 1e-7;
double n, m;
ll cnt;
double a[6] = {1, 5, 10, 10, 5, 1}; //有i个暴击的组合数
bool check(double p) {
p /= 100;
double res = 0;
for (ll k = cnt; k <= 5; k++) {
double x = 1;
x *= pow(p, k); //暴击的概率
x *= pow(1 - p, 5 - k); //不暴击的概率
res += x * a[k];
}
if (res * 100.0 >= 90.0)return true;
return false;
}
int main() {
ll T;
cin >> T;
while (T--) {
cin >> n >> m;
if (n * 2 * 5 < m)cout << "HZWZ" << endl;
else {
cnt = 0;
double sum = n * 5.0;
while (sum < m)sum += n, cnt++; //算暴击次数
double l = 0, r = 100;
while (r - l > eps) { //浮点二分
double mid = (l + r) / 2.0;
if (check(mid))r = mid;
else l = mid;
}
printf("%.2f\n", l);
}
}
}