Red Huang

Red Huang

Codeforces Round #114 (Div. 1) B. Wizards and Huge Prize

Difficult problem....DP referenced tutorial and solution report

This problem gives n, l, k

So we use these three to do DP state transition

dp[i][j][m] win j of the first i days and get total bag Probability

So

If we get a bag

dp[i+1][j+1][m+w[i]]=dp[i][j][m]*p[i]

If we get a trophy

dp[i+1][j+1][m-1]=dp[i][j][m]*p[i]

If we get nothing

dp[i+1][j][m]=dp[i][j][m]*(1-p[i])

So after calculating, as long as we get l or more days in n days, and the bag is not empty, we can add up the probabilities

Because it means you can get them all back, just add up all the probabilities of getting them back~~~~~

//  
//        GGGGGGGGGGGGG        CCCCCCCCCCCCC               AAA  
//     GGG::::::::::::G     CCC::::::::::::C              A:::A  
//   GG:::::::::::::::G   CC:::::::::::::::C             A:::::A  
//  G:::::GGGGGGGG::::G  C:::::CCCCCCCC::::C            A:::::::A  
// G:::::G       GGGGGG C:::::C       CCCCCC           A:::::::::A  
//G:::::G              C:::::C                        A:::::A:::::A  
//G:::::G              C:::::C                       A:::::A A:::::A  
//G:::::G    GGGGGGGGGGC:::::C                      A:::::A   A:::::A  
//G:::::G    G::::::::GC:::::C                     A:::::A     A:::::A  
//G:::::G    GGGGG::::GC:::::C                    A:::::AAAAAAAAA:::::A  
//G:::::G        G::::GC:::::C                   A:::::::::::::::::::::A  
// G:::::G       G::::G C:::::C       CCCCCC    A:::::AAAAAAAAAAAAA:::::A  
//  G:::::GGGGGGGG::::G  C:::::CCCCCCCC::::C   A:::::A             A:::::A  
//   GG:::::::::::::::G   CC:::::::::::::::C  A:::::A               A:::::A  
//     GGG::::::GGG:::G     CCC::::::::::::C A:::::A                 A:::::A  
//        GGGGGG   GGGG        CCCCCCCCCCCCCAAAAAAA                   AAAAAAA  
#include <iostream>  
#include <cstdio>  
#include <cstring>  
#include <algorithm>  
#include <cmath>  
#include <climits>  
#include <vector>  
#include <set>  
#include <map>  
#include <queue>  
#include <cctype>  
#include <utility>  
#include <ctime>  
using namespace std;  
#ifdef DEBUG  
#define VAR(a,b) decltype(b) a=(b)  
#define debug(...) printf("DEBUG: "),printf(\_\_VA\_ARGS\_\_)  
#define gettime() end\_time=clock();printf("now running time is %.7f\\n",(float)(end\_time - start\_time)/CLOCKS\_PER\_SEC);  
#else  
#define VAR(a,b) \_\_typeof(b) a=(b)  
#define debug(...)  
#define gettime()  
#endif  
typedef unsigned int uint;  
typedef long long int Int;  
typedef unsigned long long int UInt;  
#define Set(a,s) memset(a,s,sizeof(a))  
#define Write(w) freopen(w,"w",stdout)  
#define Read(r) freopen(r,"r",stdin)  
#define Pln() printf("\\n")  
#define I\_de(x,n)for(int i=0;i<n;i++)printf("%d ",x\[i\]);Pln()  
#define De(x)printf(#x"%d\\n",x)  
#define For(i,x)for(int i=0;i<x;i++)  
#define CON(x,y) x##y  
#define Pmz(dp,nx,ny)for(int hty=0;hty<ny;hty++){for(int htx=0;htx<nx;htx++){\\  
    printf("%d ",dp\[htx\]\[hty\]);}Pln();}  
#define M 30005  
#define PII pair<int,int\>  
#define PB push\_back  
#define oo INT\_MAX  
#define Set\_oo 0x3f  
#define FOR(a,b) for(VAR(a,(b).begin());a!=(b).end();++a)  
#define eps 1e-6  
#define X first  
#define Y second  
clock\_t start\_time=clock(), end\_time;  
bool xdy(double x,double y){return x>y+eps;}  
bool xddy(double x,double y){return x>y-eps;}  
bool xcy(double x,double y){return x<y-eps;}  
bool xcdy(double x,double y){return x<y+eps;}  
int min3(int x,int y,int z){  
    int tmp=min(x,y);  
    return min(tmp,z);  
}  
int max3(int x,int y,int z){  
    int tmp=max(x,y);  
    return max(tmp,z);  
}  
double dp\[205\]\[205\]\[420\];  
int n,l,k;  
int no=200;  
int ed=400;  
int a\[205\];  
int w\[205\];  
int main() {  
    ios\_base::sync\_with\_stdio(0);  
    while(~scanf("%d%d%d",&n,&l,&k)){  
        for(int i=1;i<=n;i++)scanf("%d",&a\[i\]);  
        for(int i=1;i<=n;i++)scanf("%d",&w\[i\]);  
        Set(dp,0);  
        dp\[0\]\[0\]\[no+k\]=1;  
        for(int i=1;i<=n;i++){  
            for(int j=0;j<i;j++){  
                for(int k=0;k<=ed;k++){  
                    if(w\[i\]!=-1){  
                        int t=min(k+w\[i\],ed);  
                        dp\[i\]\[j+1\]\[t\]+=dp\[i-1\]\[j\]\[k\]\*(a\[i\]/100.);  
                    }else if(k>0){  
                        dp\[i\]\[j+1\]\[k-1\]+=dp\[i-1\]\[j\]\[k\]\*(a\[i\]/100.);  
                    }  
                    dp\[i\]\[j\]\[k\]+=dp\[i-1\]\[j\]\[k\]\*((100-a\[i\])/100.);  
                }  
            }  
        }  
        double ans=0;  
        for(int i=l;i<=n;i++){  
            for(int j=no;j<=ed;j++){  
                ans+=dp\[n\]\[i\]\[j\];  
            }  
        }  
        printf("%.12f\\n",ans);  
    }  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
}  

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。