漸化式でqが決まった時の20点になる確率を求める関数を作り。
それを二分探索でqを求めるだけです。
試行錯誤時間10分
コード記述時間10分
計算時間1秒
#include<stdio.h>
#include<map>
#include<vector>
#include<iostream>
#include<set>
#include<math.h>
//q 20点になる確率
//51 0.031619
//52 0.024016
//53 0.018097
//0.02より大きい場合は増加
//0.02より小さい場合は減少
double f(double q){
double ps[51];
memset(ps,0,sizeof(ps));
ps[0]=1;
for(double x=1;x<=50;x+=1){
double ps2[51];
memset(ps2,0,sizeof(ps2));
double a=1-x/q;
double b=1-a;
for(int i=0;i<50;i++){
ps2[i+1]+=ps[i]*a;
ps2[i]+=ps[i]*b;
}
memcpy(ps,ps2,sizeof(ps2));
}
return ps[20];
}
void f2(double l,double r){
for(int i=0;i<50;i++){
double m=(l+r)/2.0;
double p=f(m);
if(fabs(r-l)<0.0000000001){
printf("ans=%.10lf\n",m);
break;
}
if(p>0.02){
l=m;
}else{
r=m;
}
printf("%.12lf %.12lf\n",m,p);
}
}
int main(){
f2(51,53);
}
最終更新:2015年11月27日 12:58