CF802E题解

· · 题解

题目传送门

前置知识:泊松分布和均匀分布

泊松分布

![泊松分布](https://cdn.luogu.com.cn/upload/image_hosting/0k0zs9ms.png) 我们看到,这张图里大部分数据集中于中间的几段,而分布较远的则几乎趋近于 $0$。像这种类似于正态分布的分布图象,被称为 $\text{Poisson}$ 分布。 下面是几个 $\text{Poisson}$ 分布的性质: - 泊松分布的概率函数为: $$P(x = k) = {{\lambda ^ k} \over {k!}}e^{-\lambda},k = 0,1,\cdots$$ - 特征函数为: $$\psi(t) = exp(\lambda(e ^{it} - 1))$$ $1.$ 泊松分布是一种描述和分析稀有事件的概率分布。要观察到这类事件,样本含量必须很大。 $2.$ $\lambda$ 是泊松分布所依赖的唯一参数。$\lambda$ 值愈小,分布愈偏倚,随着增大,分布趋于对称。 $3.$当 $\lambda = 20$ 时分布泊松分布接近于正态分布;当 $\lambda = 50$ 时,可以认为泊松分布呈正态分布。实际上,当 $\lambda \geq 20$ 时就可以用正态分布来近似地处理泊松分布的问题。 ### 均匀分布 在概率论和统计学中,均匀分布也叫矩形分布,它是对称概率分布,在相同长度间隔的分布概率是等可能的。 记数据中最小值为 $a$,最大值为 $b$,则概率函数可以如下表示: $$f(x)= \begin{cases} \frac{1}{b - a} & a < x < b \\ 0 & else.\end{cases}$$ **那么,如何用 $\text{OI}$ 实现判断两者呢?** ## 分析 我们看到,泊松分布主要是集中在中部,那么我们求出整个数列的平均值,如果 $80 \%$ 的数据都分布在平均值的两侧不远,我们就判定这组数据为泊松分布,否则为均匀分布。 如果为泊松分布,那么输出整个数列的平均数 $\text{average}$,如果为均匀分布,由上面所讲的概率函数,输出最大值和最小值的平均数即可。 ![泊松分布](https://cdn.luogu.com.cn/upload/image_hosting/vbx0d8vv.png) ## 代码 下面是 AC 代码 $\,\,\,$ [AC 记录](https://www.luogu.com.cn/record/141735115) ```cpp #include<bits/stdc++.h> using namespace std; int a[255],ans,sum,minn,maxn; int work() { minn = 2e9,maxn = -1; sum = 0; ans = 0; for(int i = 1;i <= 250;i++) { cin >> a[i]; sum += a[i];//计算数据的和,从而计算平均数 minn = min(minn,a[i]);//最小值 maxn = max(maxn,a[i]);//最大值 } double average = (double)sum / 250; double averaged = average / 2;//应当大致分布于平均值的两侧且与平均值的差在平均值的一半以内 for(int i = 1;i <= 250;i++) { if(a[i] - average < averaged && a[i] - average > 0 - averaged) ans++;//统计符合的个数 } if(ans >= 200) return (int)average;//大于 80%即 200个 else return (int)maxn * 0.5 - minn * 0.5; } int main() { int T; cin >> T; while(T--) { cout << work() << endl; } return 0; } ```