codeforces 730 C题解

一个看懂了不会写代码的题,要学的还有很多。

问题是这样:给你一个c, m, p, v。代表着概率,然后你抽奖会改变他们的概率。然后你最后要得到的是p。

每次抽奖后抽到的那个如果不是p, 就看是否大于v,如果大于就减去v,否则为0。另外两个要加上v/2或者(减的那个数)/ 2。(如果大于0的话。如果有一个为0了,那么他就不变,给不为0的加上,保证c + m + p = 1)。

思路:

dfs遍历,具体看代码。

链接:https://codeforces.com/contest/1543/problem/C

 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define ctx cout << "xxxxx" << endl
#define inf 0x3f3f3f3f
#define int long long
#define eps 0.000000001
const int INF = 0x3f3f3f3f;
const double pai = 3.141592653589;
const int maxn = 2e5+10;
int num[maxn];
double ans;
double c, m, p, v;

//id是数量,s是累乘
void dfs1(double c, double m, double p, double id, double s){
if(c > eps){
if(c >= v){
if(m > eps) dfs1(c-v, m+v/2, p+v/2, id+1, s*c);
else dfs1(c-v, m, p+v, id+1, s*c);
}else{
if(m > eps) dfs1(0, m+c/2, p+c/2, id+1, s*c);
else dfs1(0, m, p+c, id+1, s*c);
}
}
if(m > eps){
if(m >= v){
if(c > eps) dfs1(c+v/2, m-v, p+v/2, id+1, s*m);
else dfs1(c, m-v, p+v, id+1, s*m);
}else{
if(c > eps) dfs1(c+m/2, 0, p+m/2, id+1, s*m);
else dfs1(c, 0, p+m, id+1, s*m);
}
}

ans += id * s * p;
}


signed main(){
int t;
cin >> t;
while(t--){
ans = 0;
cin >> c >> m >> p >> v;
dfs1(c, m, p, 1, 1);
cout << fixed << setprecision(12) << ans << endl;
}
}

 

posted @ 2021-07-08 17:03  李发?  阅读(71)  评论(0)    收藏  举报