zoukankan      html  css  js  c++  java
  • 【BZOJ4008】[HNOI2015]亚瑟王

    【BZOJ4008】[HNOI2015]亚瑟王

    题面

    bzoj

    洛谷

    题解

    由期望的线性性

    可以知道,把所有牌打出的概率乘上它的伤害加起来就是答案

    记第$i$张牌打出的概率为$fp[i]$

    $$ ans=sum_{i=0}^{n-1}d[i]*fp[i] $$

    题目转化为求所有的$fp[i]$

    如何求呢?

    可以容易地知道

    $$ fp[0]=1-(1-p[i])^r $$

    这就是所有轮都打不出的概率

    那么后面的$fp$怎么办?

    发现因为有“打完牌结束该轮”的条件

    不好直接算出后面的概率

    这时候我们把$dp$拿出来。

    设$f[i][j]$表示前$r$轮中,前$i$张卡一共出了$j$张的概率

    那么假设我们知道了所有$f[i][j]$如何求$fp$?

    和$fp[0]$类似,我们有

    $$ fp[i]=sum_{j=0}^{r}f[i - 1][j]×(1-(1-p[i])^{r-j}) $$

    那么怎么求出$f$呢

    我们由第$i$张牌最终选没选讨论一下

    $$ 1.f[i][j]+=f[i-1][j]*(1-p[i])^{r-j}(i>0)\ 2.f[i][j]+=f[i-1][j-1]*(1-(1-p[i])^{r-j+1})(i>0,j>0) $$

    这题就差不多解决了

    代码

    #include <iostream> 
    #include <cstdio>
    #include <cstdlib>
    #include <cstring> 
    #include <cmath> 
    #include <algorithm>
    using namespace std; 
    const int MAX_N = 250; 
    const int MAX_R = 140; 
    int N, R; 
    double p[MAX_N], d[MAX_N], pw[MAX_N][MAX_R]; 
    double f[MAX_N][MAX_R], fp[MAX_N]; 
    void Prepare() { 
    	for (int i = 0; i < N; i++) { 
    		pw[i][0] = 1.0; 
    		for (int j = 1; j <= R; j++) pw[i][j] = (1.0 - p[i]) * pw[i][j - 1]; 
    	} 
    } 
    void solve() { 
    	memset(f, 0, sizeof(f)); 
    	memset(fp, 0, sizeof(fp)); 
    	f[0][0] = pw[0][R]; 
    	f[0][1] = fp[0] = 1 - f[0][0]; 
    	for (int i = 1; i < N; i++) { 
    		for (int j = 0; j <= R; j++) { 
    			f[i][j] += f[i - 1][j] * pw[i][R - j]; 
    			if (j > 0) f[i][j] += f[i - 1][j - 1] * (1.0 - pw[i][R - j + 1]); 
    		} 
    	} 
    	for (int i = 1; i < N; i++) 
    		for (int j = 0; j <= R; j++) fp[i] += f[i - 1][j] * (1.0 - pw[i][R - j]); 
    } 
    int main () { 
    	int T; scanf("%d", &T);
    	while (T--) { 
    		scanf("%d%d", &N, &R); 
    		for (int i = 0; i < N; i++) scanf("%lf%lf", &p[i], &d[i]); 
    		Prepare();
    		solve(); 
    		double ans = 0; 
    		for (int i = 0; i < N; i++) ans += d[i] * fp[i]; 
    		printf("%0.10lf
    ", ans); 
    	} 
    	return 0; 
    } 
    
  • 相关阅读:
    ASP.NET初识4
    属性
    ASP.NET初识4
    ACCP6.0第九章练习
    ASP.NET初识1
    鼠标指针含义
    ASP.NET初识2
    第三部分
    ASP.NET初识3
    ASP.NET初识5
  • 原文地址:https://www.cnblogs.com/heyujun/p/10255214.html
Copyright © 2011-2022 走看看