宁波多校(一) B题 狂赌之渊(dfs+概率)

概率+暴力dfs

可以暴力枚举所有的状态,判断是否成立,对于每个状态,记录抽到这个状态的概率,如果能成功,就在答案上加上这个概率

#include <cstdio>
#include <algorithm>
#include<iostream>
using namespace std;
const int N=1e5+10;
int t;
int a[N];
int x[N];
double ans;
int flag;
int v[N];
int d[N];
int all;
bool check(int u){
    int i;
    for(i=0;i<3&&!flag;i++){
        if(!v[i]){
            if(d[i]==(x[u]+1)%3)//当前手牌被击败,换一张
                continue;
            if(d[i]==x[u]-1){//两个人的手牌相等,可以考虑递归检验,如果以当前为首位不行,才换一张
                v[i]=1;
                check(u+1);
                v[i]=0;
            }
            else{//直接击败
                flag=1;
                return true;
            }
        }
    }
    return false;
}
void dfs(int u,double P){
    if(u==3){
        flag=0;
        check(0);
        if(flag)
            ans+=P;
        return ;
    }
    for(int i=0;i<3;i++){
        if(!a[i])
            continue;
        a[i]--;
        d[u]=i;
        dfs(u+1,P*(a[i]+1)/(all-u));
        a[i]++;
    }
}
int main() {
    cin>>t;
    while(t--){
        cin>>a[0]>>a[1]>>a[2]>>x[0]>>x[1]>>x[2];
        all=a[0]+a[1]+a[2];
        ans=0;
        dfs(0,1);
        printf("%.2f
",ans);
    }
}
View Code
原文地址:https://www.cnblogs.com/ctyakwf/p/13251456.html