专栏文章
题解:P10668 BZOJ2720 [Violet 5] 列队春游
P10668题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @minn4d0u
- 此快照首次捕获于
- 2025/12/02 05:07 3 个月前
- 此快照最后确认于
- 2025/12/02 05:07 3 个月前
[列队春游] 题解
题意
给定整数序列 ,对于随机排列 ,求 的期望。
对于位置 , 定义为最小的 ,满足对于任意位置 ,均有 。
数据范围:。
题解
设 为第 位的贡献,我们要求的是 。
这等价于求:
枚举小于 的数,则:
其中 表示数 对 产生贡献的概率。
通过古典概型的方法求出 。假设有 个小于 的数,将 和 绑在一起,先不考虑其他的 个小于 的数,有 种排列,然后再将剩下 个数插进来。故概率为:
因此:
对于每个数分别求出 即可。
算法步骤
- 读入 和数组
- 对 排序,得到每个 的排名,从而得到 (严格小于 的数的个数)
- 计算
- 输出结果
复杂度分析
- 时间复杂度:
- 空间复杂度:
代码实现要点
- 注意处理重复元素的情况
- 使用双精度浮点数计算期望值并且输出时保留两位小数
CODE
CPP#include<bits/stdc++.h>
using namespace std;
int n,h[305];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
cin>>h[i];
sort(h+1,h+1+n);
long double ans=0,pre=0;
for(int i=1;i<=n;i++){
if(h[i]!=h[i-1])
pre=i-1;
ans+=pre/(n-pre+1);
ans++;
}
cout<<fixed<<setprecision(2)<<ans;
return 0;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...