吉林区域赛 D - The Moon

https://vjudge.net/contest/386991#problem/D

题意:给出4个操作步骤,让我们模拟操作,问拿到数据箱子的期望轮数是多少

思路:

(思路:首先肯定是q,即掉落率为100时结束。dp[i][j]表示胜率为i,掉落率为q时的期望。记忆化搜索时,当q>=1000时(因为有1.5,所以乘以1000),直接返回p/100.0;(期望可以理解成概率的倒数)否则,这时的期望便为

1.0+(p/100.0)*(1.0-q/1000.0)*dfs(p,q+20)+(1.0-p/100.0)*dfs(p,q+15)。即本场+获胜为掉落+失败。)

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 double dp[110][1010];
 5 double dfs(int p,int q)
 6 {
 7     //cout<<p<<" "<<q<<endl;
 8     if(q>=1000) return 100.0/p;//期望其实是概率的倒数,因为100%掉落,只需要考虑获胜要进行的场次 
 9     if(dp[p][q]!=-1) return dp[p][q];//记忆化搜索 
10     dp[p][q]=1.0+(p/100.0)*(1.0-q/1000.0)*dfs(p,q+20)+(100.0-p)/100.0*dfs(p,q+15);
11     //1.0这一场次+获胜但没掉落+失败 
12     return dp[p][q];
13 }
14 int main(void)
15 {
16     for(int i=1;i<=100;i++)
17         for(int j=1;j<=1000;j++)
18             dp[i][j]=-1;
19     int cas=0,t;
20     scanf("%d",&t);
21     while(t--)
22     {
23         int p;
24         scanf("%d",&p);    
25         printf("Case %d: %.10f\n",++cas,dfs(p,20));    
26     }
27     return 0;
28 }

 

posted @ 2020-09-27 19:06  古比  阅读(113)  评论(0编辑  收藏  举报