• 【POJ 3744】 Scout YYF I


    【题目链接】

                http://poj.org/problem?id=3744

    【算法】

                概率DP + 矩阵乘法

    【代码】

                

    #include <algorithm>
    #include <bitset>
    #include <cctype>
    #include <cerrno>
    #include <clocale>
    #include <cmath>
    #include <complex>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <ctime>
    #include <deque>
    #include <exception>
    #include <fstream>
    #include <functional>
    #include <limits>
    #include <list>
    #include <map>
    #include <iomanip>
    #include <ios>
    #include <iosfwd>
    #include <iostream>
    #include <istream>
    #include <ostream>
    #include <queue>
    #include <set>
    #include <sstream>
    #include <stdexcept>
    #include <streambuf>
    #include <string>
    #include <utility>
    #include <vector>
    #include <cwchar>
    #include <cwctype>
    #include <stack>
    #include <limits.h>
    using namespace std;
    
    int i,n;
    double p,g,ans;
    double x[20];
    
    struct Matrix
    {
            double mat[3][3];
    } m;
    
    inline Matrix multipy(Matrix &a,Matrix b)
    {
            int i,j,k;
            Matrix res;
            memset(res.mat,0,sizeof(res.mat));
            for (i = 1; i <= 2; i++)
            {
                    for (j = 1; j <= 2; j++)
                    {
                            for (k = 1; k <= 2; k++)
                            {
                                    res.mat[i][j] += a.mat[i][k] * b.mat[k][j];    
                            }    
                    }    
            }        
            return res;
    }
    inline Matrix power(Matrix a,int n)
    {
            int i,j;
            Matrix res,b = a;
            for (i = 1; i <= 2; i++)
            {
                    for (j = 1; j <= 2; j++)
                    {
                            res.mat[i][j] = (i == j); 
                    }        
            }    
            while (n)
            {
                    if (n & 1) res = multipy(res,b);
                    b = multipy(b,b);
                    n >>= 1;
            }
            return res;
    }
    
    int main() 
    {
            
            while (scanf("%d%lf",&n,&p) != EOF)
            {
                    for (i = 1; i <= n; i++) scanf("%lf",&x[i]);
                    sort(x+1,x+n+1);
                    m.mat[1][1] = p; m.mat[1][2] = 1 - p;
                    m.mat[2][1] = 1; m.mat[2][2] = 0;
                    ans = 1.0;
                    x[0] = 0;
                    for (i = 1; i <= n; i++)
                    {
                            m = power(m,x[i]-x[i-1]-1);        
                            g = m.mat[1][1];
                            ans *= (1 - g);
                            m.mat[1][1] = p; m.mat[1][2] = 1 - p;
                            m.mat[2][1] = 1; m.mat[2][2] = 0;        
                    }     
                    printf("%.7lf
    ",ans);
            }
            
            return 0;
        
    }
  • 相关阅读:
    程序员的 59 条搞笑但却真实无比的编程语录
    Github最流行的10,000个Java项目使用的类库
    10大怪异的编程语言
    如何写一篇好的技术博客
    四件在我步入职业软件开发生涯那天起就该知道的事情
    程序员最艰巨的十大任务
    10 个理由让你继续干 IT
    被诅咒的程序员的七宗罪
    顶级程序员的 10 条最佳实践
    谷歌如何管理世界上最聪明的工程师?
  • 原文地址:https://www.cnblogs.com/evenbao/p/9296390.html
Copyright © 2020-2023  润新知