zoukankan      html  css  js  c++  java
  • bzoj2720: [Violet 5]列队春游(概率期望+组合数学)

    Description

    Input

    Output

    Sample Input

     

    Sample Output

     

    HINT

    数学题都这么骚的么……怎么推出来的啊……我是真的想不出来……

    首先,要算总的视野期望,我们可以把每一个小朋友的视野期望算出来,然后求和

    于是考虑如何计算每个小朋友的视野期望,设$L$表示视野长度,视野期望为$ans$,则有$$ans=sum_{i=1}^n i*P(L=i)$$

    然后考虑转化一下,我们原来是枚举视野长度然后考虑概率,那么我们换一个想法,考虑它前面的第$i$个人如果被看到就会对答案有$1$的贡献,那么我们只要考虑前面的第$i$个人会被看到的概率就可以了,可以直接求和$$ans=sum_{i=1}^n P(Lgeq i)$$

    考虑概率如何计算。设不小于第$i$个小朋友身高的有$k$个人(不包括他自己),那么$$ans=sum_{i=1}^n frac{(n-i+1)A^k_{n-i}}{A^{k+1}_n}$$

    上面的式子意思就是,会挡住小朋友的人包括自己随便放总共有$A^{k+1}_n$种情况,其中那些会挡住小朋友的人不能放在小朋友前面的$i-1$个位置,也不能放在小朋友的位置,所以方案数为$A^k_{n-i}$,然后又因为小朋友自己有$n-i+1$个位置可以放,所以乘上一个$n-i+1$

    然后考虑乱推式子$$ans=sum_{i=1}^n frac{(n-i+1)frac{(n-i)!}{(n-i-k)!}}{frac{n!}{(n-k-1)!}}$$

    $$ans={frac{(n-k-1)!}{n!}}sum_{i=1}^n frac{(n-i+1)!}{(n-i-k)!}$$

    $$ans={frac{(n-k-1)!}{n!}}(k+1)!sum_{i=1}^n frac{(n-i+1)!}{(n-i-k)!(k+1)!}$$

    $$ans={frac{(n-k-1)!}{n!}}(k+1)!sum_{i=1}^n C_{n-i+1}^{k+1}$$

    $$ans={frac{(n-k-1)!}{n!}}(k+1)!C_{n+1}^{k+2}$$

    $$ans=frac{n+1}{k+2}$$

    然后对每一个高度都带进去做就行了

    ps:一开始没想通倒数第二行怎么化出来的……后来发现是自己组合数姿势不够……把求和拆开来然后前面加上一项$C_1^{k+2}$然后用组合数递推公式带进去化一下就好了……

     时间复杂度$O(n)$

     1 //minamoto
     2 #include<bits/stdc++.h>
     3 using namespace std;
     4 const int N=1005;
     5 int h[N],n,sum;double ans;
     6 int main(){
     7     scanf("%d",&n);
     8     for(int i=1,x;i<=n;++i)
     9     scanf("%d",&x),++h[x];
    10     for(int i=1;i<=1000;++i) ans+=1.0*h[i]*(n+1)/(n-sum+1),sum+=h[i];
    11     printf("%.2lf
    ",ans);
    12     return 0;
    13 }
  • 相关阅读:
    MySQL · 引擎特性 · InnoDB崩溃恢复
    MySQL · 引擎特性 · InnoDB Buffer Pool
    MySQL · 引擎特性 · InnoDB IO子系统
    MySQL · 引擎特性 · InnoDB 同步机制
    docker基本操作命令
    IIS日志导出mysql
    Win10 MySQL Community Server 8.0.17安装
    win10 TortoiseGit 图标不显示
    window环境配置nginx
    windows openssh安装
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9790465.html
Copyright © 2011-2022 走看看