zoukankan      html  css  js  c++  java
  • 题解 洛谷P4550/BZOJ1426 【收集邮票】

    这显然是一道概率的题目(废话)

    设发(f[i])表示买到第(i)张邮票还需要购买的期望次数,(g[i])表示买到第(i)张邮票还需要期望花费的钱。

    那么答案显然为(g[0]),我们来考虑怎么转移。

    对于(f[i]),有三种情况:

    • 现在有(frac{i}{n})的几率会买到重复的邮票,即(f[i] imes frac{i}{n}).
    • 现在有(frac{n-i}{n})的几率会买到新的邮票,即(f[i+1] imes frac{n-i}{n}).
    • 花费(1)次买现在的邮票。

    所以我们可以列出:(f[i]=f[i] imes frac{i}{n} + f[i+1] imes frac{n-i}{n} +1).

    方程较复杂,我们来化简一下。
    (f[i] - f[i] imes frac{i}{n} =f[i+1] imes frac{n-i}{n} +1)
    (f[i] imes frac{n-i}{n} =f[i+1] imes frac{n-i}{n} +1)
    $f[i] =f[i+1] imes frac{n}{n-i} $

    我们可以知道(f[n])是等于(0)的,所以倒推即可。

    那对于(g[i])怎么办呢?

    同理,(g[i])的推导跟(f[i])类似,也分为买到自己已有的邮票和没有的邮票两种情况,即:

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

    同时我们也来化简一下:

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

    (g[n])仍然为0,我们还是可以倒推

    #include<bits/stdc++.h>
    #define ll long long
    #define inf 0x3f3f3f3f
    #define RI register int
    using namespace std;
    const int N=1e4+2;
    int n;double f[N],g[N]; 
    inline double S(int x,int y){return (1.0*x)/(1.0*y);}
    int main(){
        scanf("%d",&n);
        for(register int i=n-1;~i;--i){
        	f[i]=f[i+1]+S(n,n-i);
        	g[i]=S(i,n-i)*f[i]+g[i+1]+f[i+1]+S(n,n-i);
        }printf("%.2lf",g[0]);
        return 0;
    }
    
  • 相关阅读:
    golang 常见疑惑总结
    golang 详解defer
    golang调试工具Delve
    ACE的源码划分
    通过#define连接字符串的特殊方法[转]
    转:extern "C"的用法解析
    转:3d max 2013 安装教程,凭着一种互联网精神提供给广大朋友
    转:Bullet物理引擎不完全指南(Bullet Physics Engine not complete Guide)
    转:折腾一晚上Bullet及Ogre相关工具的成果 -- 3Ds Max,Maya, blender, GameKit
    转:CMake快速入门教程-实战
  • 原文地址:https://www.cnblogs.com/K-Qiuly/p/10273919.html
Copyright © 2011-2022 走看看