百折不挠|

Xdik

园龄:1个月粉丝:7关注:24

「POJ 3744」Scout YYF I

题目大意:在一条有地雷的路上,你现在的起点在 1 处。在 N 个点处布有地雷。每次有 p 的概率前进 1 步,1p 的概率前进 2 步。问顺利通过这条路的概率。(不要走到有地雷的地方)。

数据规模:1N10,地雷点的坐标范围:[1,100000000]

暴力dp是ez的,但是坐标数据太大了,显然不能直接dp,有矩阵快速幂的方法,但是本文是另一种方法

观察到当连续很长一段长度都没有炸弹,那么他能安全通过的概率趋于平稳,所以可以直接把相邻两个相距很远的炸弹之间的距离压缩了

code:

#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#pragma GCC optimeze(3)
#pragma GCC optimeze(2)
#define PII pair<int, int>
#define pb push_back
#define fi first
#define se second
#define lowbit(x) (x & (-x))
using namespace std;
const int N=1e5+5;
int n,x[15],bj[N];
double p,dp[N],ans;
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	while(cin>>n>>p){
		memset(dp,0,sizeof dp);memset(bj,0,sizeof bj);ans=0,dp[1]=1;
		for(int i=1;i<=n;i++)cin>>x[i];
		sort(x+1,x+1+n); 
		for(int i=1;i<=n;i++){
			if(x[i]-x[i-1]>100){
				int k=x[i]-x[i-1];
				for(int j=i;j<=n;j++)x[j]-=(k-100);
			}
		}
		for(int i=1;i<=n;i++)bj[x[i]]=1;
		for(int i=1;i<=x[n];i++){
			if(bj[i]){dp[i]=0;continue;}
			dp[i+1]+=dp[i]*p;
			dp[i+2]+=dp[i]*(1-p);
		}
		printf("%.7lf\n",dp[x[n]+1]);
	}
	return 0;
}

本文作者:Xdik

本文链接:https://www.cnblogs.com/Xdik/p/18708117

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Xdik  阅读(4)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起