C. Need for Pink Slips
题目大意:三个盒子c,m,p,分别给定选中的概率,给定v,选中c或m时,下次抽到c或m时的概率减少v,若不足v则概率变为0,减少的概率平均分给其他两个盒子,抽中p则结束,求抽中p的期望
思路:模拟+深搜
#pragma GCC optimize(2)
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
#include <set>
using namespace std;
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define pb push_back
#define IOS ios::sync_with_stdio(false)
#define int long long
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define ls p<<1
#define rs p<<1|1
#define lson p<<1,l,mid
#define rson p<<1|1,mid+1,r
#define sf scanf
typedef long long ll;
double c,m,p,v;
double ans;
void dfs(double c, double m,double p,double now ,int t)//t是目前的次数
{
ans += now*p*t;
//抽中c
if( c>= 1e-6)
{
double x = min(v,c);
if( m>=1e-6 ) dfs(c-x,m+x/2,p+x/2,now*c,t+1);
else dfs(c-x,m,p+x,now*c,t+1);
}
//抽中m
if( m>=1e-6)
{
double x = min(v,m);
if( c>=1e-6 ) dfs(c+x/2,m-x,p+x/2,now*m,t+1);
else dfs(c,m-x,p+x,now*m,t+1);
}
}
signed main(void )
{
//!!!
// freopen("data.txt", "r", stdin);
//!!!
// IOS;
int T;cin>>T;
while( T-- )
{
cin>>c>>m>>p>>v;
ans=0;
dfs(c,m,p,1,1);
printf("%.12f\n",ans);
}
}