zoukankan      html  css  js  c++  java
  • Luogu P4550 收集邮票

    题目链接:Click here

    Solution:

    本题直接推价格似乎很难,考虑先从购买次数入手

    设购买次数(g(i))为当前有(i)种不同的邮票,要买到(n)种的期望购买次数

    可以由期望的定义得到式子:(g(x)=sum_{i=0}^{+infty}P(i,x)),其中(P(i,x))为买(i)次从(x)种买到(n)种的概率

    对于一个局面,记它可以转移到的局面集合为(to),则它的期望可以表示为

    [E(u)=sum_{vin to_u}(E(v)+cost(v,u))P(v) ]

    其中(P(v))表示从(v)局面转移到(u)局面的概率,(cost(v,u))表示从(v)转移到(u)局面的的代价

    那么对于本题也可以如此转化:(g(x)=frac{x}{n}(g(x)+1)+frac{n-x}{n}(g(x+1)+1))

    也很好理解,因为再抽一张卡,可能抽到已经抽到的,也可能抽到新的,而转移的代价都为1

    显然,(g(n)=0),再把式子转化一下,就可以得到(g(x))的计算方式:

    [frac{n-x}{n}g(x)=frac{n-x}{n}g(x+1)+1\ g(x)=g(x+1)+frac{n}{n-x} ]

    然后我们再考虑设(f(i,j))表示当前有(i)种邮票,下次购买要花(j)元时,买到(n)种的期望花费

    我们知道购买要(j)元,结合题意,就能很好的推出(f(i,j))的转化方程:

    [f(i,j)=frac{i}{n}(f(i,j+1)+j)+frac{n-i}{n}(f(i+1,j+1)+j)\ f(i,j)=frac{i}{n}f(i,j+1)+frac{n-i}{n}f(i+1,j+1)+j\ ]

    我们考虑一下(f(i,j))的定义,便可以得出式子:

    [f(i,j)=sum_{u=0}(j+(j+1)+dots+(j+u-1))P(u,i)\ f(i,j)=sum_{u=0}frac{u(2j+u-1)}{2}P(u,i)\ ]

    这里(P)的定义同上文(g(x))定义式中的(P),然后我们再考虑表示(f(i,j+1)),很简单,带入即可

    [f(i,j+1)=sum_{u=0}frac{u(2j+u+1)}{2}P(u,i) ]

    考虑表示将(f(i,j+1))减去(f(i,j))可得:(f(i,j+1)-f(i,j)=sum_{u=0}uP(u,i))

    可以发现它与前面的期望定义式是一样的,则我们得到式子:(f(i,j+1)=f(i,j)+g(i))

    则我们可以把(f(i,j))表示一下:

    [f(i,j)=frac{i}{n}f(i,j+1)+frac{n-i}{n}f(i+1,j+1)+j\ f(i,j)=frac{i}{n}(f(i,j)+g(i))+frac{n-i}{n}(f(i+1,j)+g(i+1))+j ]

    事实上我们只需求出(f(0,1)),而在递推中可以发现(j)是没有变化的,则可以直接忽略(j)

    [f(i)=frac{i}{n}(f(i)+g(i))+frac{n-i}{n}(f(i+1)+g(i+1))+1\ frac{n-i}{n}f(i)=frac{i}{n}g(i)+frac{n-i}{n}f(i+1)+frac{n-i}{n}g(i+1)+1\ f(i)=frac{i}{n-i}g(i)+f(i+1)+g(i+1)+frac{n}{n-i} ]

    Code:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e4+1;
    int n;double u,f[N],g[N];
    int read(){
    	int x=0,f=1;char ch=getchar();
    	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    	return x*f;
    }
    int main(){
    	n=read();f[n]=g[n]=0;u=n;
    	for(int i=n-1;~i;i--) g[i]=g[i+1]+u/(u-i);
    	for(int i=n-1;~i;i--){
    		double x=i,y=n-i;
    		f[i]=f[i+1]+g[i+1]+x/y*g[i]+u/y;
    	}Pintf("%.2lf",f[0]);
    	return 0;
    }
    
    

    题外话:推的时候发现了另外一个式子:设(P(x))表示用(x)步刚好取到所有邮票的概率,则:

    [P(x)=frac{1}{n}Pi_{i=0}^{n-2}frac{n-i}{n}Pi_{i=1}^{x-n}frac{n-1}{n}\ P(x)=frac{n!(n-1)^{x-n}}{n^x} ]

    式子也很好理解,保证最后取到没取到的那种,再取完其它的种类,剩下的步数只要不取到最后那枚就行

    则本题也可以这样求:

    [sum(n)=sum_{i=1}^ni\ E(0)=sum_{i=n}^{+infty}P(i)sum(i) ]

    然后对这个式子求个通项就行了,不过我还不会求。。。

  • 相关阅读:
    shiro密码的比对,密码的MD5加密,MD5盐值加密,多个Relme
    shiro权限配置的细节问题&认证
    shiro集成spring&工作流程&DelegatingFilterProxy
    shiro简单入门介绍
    springmvc小结(下)
    springmvc小结(上)
    springmvc(5)拦截器
    spring mvc(4)处理模型数据
    springmvc(3)注解
    深入理解javascript作用域系列第四篇——块作用域
  • 原文地址:https://www.cnblogs.com/NLDQY/p/11160719.html
Copyright © 2011-2022 走看看