UVa 10491 Cows and Cars(確率計算)

1210 ワード

UVa 10491 Cows and Cars
この問題の大意はこうです.
a+bのドアがあなたの前にあります.その中で、aの後ろは乳牛で、bの後ろは車です.ドアを勝手に選んでもいいですが、開けません.この时、司会者(ゲスト)はあなたに他のc扇の后ろに乳牛のドアを开けて、それからあなたは选択をして、このドアを引き続き选ぶのか、それともまだ开いていないドアを交换するのか.私たちが答えなければならないのは、常に「もう1枚交換」を選択する条件の下で、選択したドアの後ろが車である確率はいくらですか.
データ範囲:
1<=a<=10000, 1<=b<=10000, 0<=cこれは確率の計算問題で、一般的にこのような問題は主に公式を押して、押し終わった後でとてもよくして、以下で構想を簡単に述べます:
1>最初に選択したドアの後ろに牛が1頭、確率がa/(a+b)であれば、司会者がc頭牛を出してくれた後、残りは全部でa+b-c-1ドアがあり、このとき後ろが車である確率がb/(a+b-c-1)であれば、総確率はa*b/(a+b-c-1)*(a+b)である.
2>最初に選択したドアの後ろに車が1台、確率がb/(a+b)であれば、司会者がc頭牛を出してくれた後、残りは全部でa+b-c-1ドアがあり、このとき後ろに車が再選択される確率は(b-1)/(a+b-c-1)であり、総確率はb*(b-1)/(a+b-c-1)*(a+b)である.
それは、b*(a+b-1)/(a+b-c-1)*(a+b)の加算である可能性があります.コードは次のとおりです.
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
	int a,b,c;
	while (~scanf("%d%d%d",&a,&b,&c))
	{
		double s;
		if (!b || a+b==c+1) s=0;//                   ,         0
		else s=(double)((double)(b*(a+b-1))/(double)((a+b-c-1)*(a+b)));
		printf("%0.5lf
",s); } return 0; }