1. 程式人生 > 其它 >codeforces 730 C題解

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;
}
}