プロジェクトオイラー問286

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%20286
バスケシュートの得点確率数式パラメータを求める問題。

漸化式で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