混元形异太极门掌门人马*国强势入驻王者峡谷,其独门绝技闪电伍连鞭,连续五次攻击不仅伤害爆炸而且还可暴击,一举成为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
代码长度限制
16 KB
时间限制
2000 ms
内存限制
64 MB
栈限制
8192 KB
概率是硬伤知道不会写。。。。
要求出我们至少需要的暴击次数然后枚举暴击概率就可以了
数组d储存 c(1,5)到c(5,5)的值
精度要开到1e-6不然会wa.....QAQ
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+15;
int n,m;
const double minn=1e-4;
int d[6]={1,5,10,10,5,1};
double arr[6];
int main() {
for(int j=0;j<=5;j++){
for(double i=0;i<=1;i+=0.000001){
double ans=0;
for(int x=j;x<=5;x++){
double ans1=1.0;
for(int k=1;k<=x;k++)ans1*=i;//暴击次数
for(int k=x+1;k<=5;k++)ans1*=(1.0-i);//不暴击次数
ans1*=d[x];
ans+=ans1;
}
if(ans>=0.9){
arr[j]=i*100.0;
break;
}
}
}
cin>>n;
for(int j=1;j<=n;j++){
int a=0,b=0;
cin>>a>>b;
b-=a*5;
int cnt;
if(b<=0)cnt=0;
else cnt=(b+a-1)/a;
if(cnt>5){
cout<<"HZWZ"<<endl;
}else{
printf("%.2lf\n",arr[cnt]);
}
}
return 0;
}