• [JLOI2012]时间流逝


    Description:

    你有n个食物,每个食物有(a_i)的价值,你每天有(p_i)的几率被抢走一个最小价值的食物,否则可以等概率获得所有食物中价值小于你拥有的食物中最大价值中的一个,问总价值达到T价值的期望天数

    Hint:

    (n,T le 50)

    Solution:

    发现数据范围很小

    考虑搜出所有状态

    (dp[i])表示达到总能量为(i)的期望天数

    转移方程:

    (dp[i]=p*dp_{last}+(1-p)*frac{1}{|next|}sum dp_{next_i}+1)

    但是这样有后效性,需要转化把(dp_{next_i}​)表示为(k*dp[i]+b​)的形式

    (G=(1-p)*frac{1}{|next|}​)

    (dp[i]=p*dp_{last}+G*sum( k*dp[i]+b)+1)

    整理得:

    (dp[i]=frac{p}{1-G*sum k}dp_{last} +frac{1+G*sum b}{1-G*sum k})

    于是就相当于一棵树,由0出发,用下面的状态递推出根的(k)(b)

    而根没有(last)状态,所以答案就是(b)

    注意每个特判初始空状态

    #include <map>
    #include <set>
    #include <stack>
    #include <cmath>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #define ls p<<1 
    #define rs p<<1|1
    using namespace std;
    typedef long long ll;
    
    inline int read() {
    	char c=getchar(); int x=0,f=1;
    	while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
    	while(c<='9'&&c>='0') {x=(x<<3)+(x<<1)+(c&15);c=getchar();}
    	return x*f;
    }
    inline int chkmax(int &x,int y) {if(x<y) x=y;}
    inline int chkmin(int &x,int y) {if(x>y) x=y;}
    
    int n,t,a[100];
    double p;
    
    struct data {
    	double k,b;
    }tp,ans;
    
    data dfs(int s,int mx) {
    	if(s>t) return (data){0.0,0.0};
    	double x=1.0/mx,nk=0,nb=0,pi=0;
    	for(int i=1;i<=mx;++i) {
    		tp=dfs(s+a[i],i);
    		nb+=tp.b,nk+=tp.k;
    	}
    	pi=s?p:0.0; x*=(1.0-pi);
    	nb=(1.0+x*nb)/(1.0-x*nk);
    	nk=pi/(1.0-x*nk);
    	return (data){nk,nb};
    }
    
    int main()
    {
    	while(scanf("%lf%d%d",&p,&t,&n)!=EOF) {
    		for(int i=1;i<=n;++i) scanf("%d",a+i);
    		sort(a+1,a+n+1);
    		printf("%.3lf
    ",dfs(0,n).b);
    	}
        return 0;
    }
    
    
  • 相关阅读:
    .NET Remoting 应用实例
    EXT.NET 使用总结(3)--动态图表
    2013,2014
    TreeMap put 操作分析
    C#排序算法小结
    高性能的JavaScript--数据访问(1)
    javascript生成对象的三种方法
    Android开发中经常使用的Content-Type简介
    git diff提示filemode发生改变(old mode 100644、new mode 10075)
    UIWebView的使用
  • 原文地址:https://www.cnblogs.com/list1/p/10527194.html
Copyright © 2020-2023  润新知