标签:des style color io os ar for strong sp
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 5062 | Accepted: 1370 |
Description
Input
Output
Sample Input
1 0.5 2 2 0.5 2 4
Sample Output
0.5000000 0.2500000
题意:人人从1开始走,p的概率走1步,1-p的概率走2步,求不踩雷的概率。地雷数N<=10,坐标范围在100000000内。
思路:人走到第i位置的概率为dp[i]=dp[i-1]*p+dp[i-2]*(1-p),由于数据范围较大,可有矩阵快速幂快速求出答案;
构造矩阵 | P , 1 | 即 | dp[n+1] , dp[n] | = | dp[n] , dp[n-1] | * | P , 1 |
| 1-P , 0 | | 1-P , 0 |
然后将每个a[i]+1到a[i+1]看做一段单独处理就行。
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn=100000050;
struct node
{
double mat[2][2];
}A,B,C;
double dp[maxn],p;
int n,a[15];
void input()
{
for(int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,a+n);
A.mat[0][0]=p,A.mat[0][1]=1.0;
A.mat[1][0]=1.0-p,A.mat[1][1]=0.0;
}
node mul(node p,node q) // 矩阵相乘
{
node ans;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
{
ans.mat[i][j]=0.0;
for(int k=0;k<2;k++)
ans.mat[i][j]+=p.mat[i][k]*q.mat[k][j];
}
return ans;
}
node pow(node w,int num) // 快速幂
{
node ret=B,c=w;
int coun=num;
while(coun)
{
if(coun & 1) ret=mul(ret,c);
coun>>=1;
c=mul(c,c);
}
return ret;
}
void solve()
{
int now=1;
double f1=0.0,f2=1.0;
for(int i=0;i<n;i++)
{
if(a[i]-now>=1)
{
node tmp=pow(A,a[i]-1-now);
f2=(f2*tmp.mat[0][0]+f1*tmp.mat[1][0])*(1.0-p);
f1=0.0;
now=a[i]+1;
}
else
{
printf("0.0000000\n");
return ;
}
}
printf("%.7f\n",f2);
}
int main()
{
B.mat[0][0]=1.0,B.mat[0][1]=0.0;
B.mat[1][0]=0.0,B.mat[1][1]=1.0;
while(scanf("%d %lf",&n,&p)!=EOF)
{
input();
solve();
}
return 0;
}
poj 3744 Scout YYF I (概率DP+矩阵快速幂)
标签:des style color io os ar for strong sp
原文地址:http://blog.csdn.net/u012596172/article/details/40212517