[Non] 踩地雷II

[Non] 踩地雷II

大意

\(1\) 这个位置开始走的期望步数。

思路

正推较为复杂,考虑倒退。

\(f[i]\) 为从第 \(i\) 个位置向后走出迷宫或者踩到地雷的期望步数。

那么我们有 \(f[i] = f[i + 1] \times p + f[i + 2] \times (1 - p) + 1\),那么直接倒退即可。

代码

#include<iostream>
using namespace std;

const int MAXN = 1e6 + 5;
int n;
double p;
int x[MAXN];
bool vis[MAXN];
double f[MAXN];

int main(){
    
    while(cin >> n >> p){
        for(int i = 1;i <= MAXN - 1;i ++) vis[i] = 0;
        int maxx = 0;
        for(int i = 1;i <= n;i ++){
            cin >> x[i];
            vis[x[i]] = 1;
            maxx = max(maxx, x[i]);
        }
        for(int i = maxx;i >= 1;i --){
            if(vis[i]) f[i] = 0;
            else{
                f[i] = p * f[i + 1] + (1 - p) * (f[i + 2]) + 1;
            }
        }
        printf("%.7lf\n", f[1]);
    }
    
    return 0;
}
posted @ 2026-01-24 09:16  To_Carpe_Diem  阅读(2)  评论(0)    收藏  举报