数学期望加暴力分割

C. Cup of Water

题意:还是数学期望题,这套题有三个期望题(合理怀疑出题人在准备概率论考试),有点太多了。题意是给你一个容量为\(x\)的容器,每一轮等概率取\(0到x\)的水。问装满单位为1的水杯需要的期望轮数。

题解:正解没咋看懂,这里是看dls代码得来的一个挺显然的思路。

​ 我们先进行一个小变换,可以转换成以下情况,我们每次等概率取0到1的水,装满\(t = \frac{1}{x}\)的水杯。 我们定义\(f(x)\)的含义是装满容量为x的水杯所需要的期望轮数,则问题变为求\(f(t)\)

​ 根据概率论的基础知识,可以得到\(f(t) = \int_{0}^{1}f(t-x)dx\),正解就是吧这个求出来,但这个式子求出后不是个初等形式,所以使用了大量的技巧,在高数基础不够的情况下,我们该怎么办呢?对,没错,就是暴力,虽然他是个连续的式子,但是我们可以想起微积分的切片法,这样就可以把连续的式子分割成离散的,因为这道题对精度的要求比较低,实测把单位1分割成\(300000\)份就可以达到题目需要的精度要求。还有一个问题就是我们发现\(\frac{1}{x}\)离散后可能为0,易得\(f(0) = 0\),但这个显然不对,我们根据题意可以得到,只要\(1/x\)不为\(0\),那么期望必然不为\(0\),所以离散化得注意和\(1\)取一个\(max\)

#include <bits/stdc++.h>
using namespace std;
#define db double
const int dx=300000;
double f[dx*20+10],s[dx*20+10];
int main() {
    f[0]=0;
    s[0]=0;
    for(int i=1;i<20*dx+2;i++) {
        f[i]=1.0+(s[i-1]-s[max(i-dx,0)])/((db)dx);
        s[i]=s[i-1]+f[i];
    }
    int _;
    for (scanf("%d",&_);_;_--) {
        db x;
        scanf("%lf",&x);
        printf("%.16lf\n",f[max(int(dx/x),1)]);
    }
}
posted @ 2022-05-03 20:43  mafengfa  阅读(65)  评论(0)    收藏  举报