专栏文章
题解:P11918 [PA 2025] 考试 / Egzamin
P11918题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mip6o24y
- 此快照首次捕获于
- 2025/12/03 07:02 3 个月前
- 此快照最后确认于
- 2025/12/03 07:02 3 个月前
背景知识请先阅读 https://www.luogu.com.cn/article/xs2uucwg
有 个随机变量 ,其中 有 的概率为 ,否则为 。你选择一个 ,再选择其中的 个随机变量,求最优决策下你选择的随机变量的和 的概率。,误差在 以内。
首先,可以贪心地选随机变量,因为希望和尽可能大,所以优先选 大的随机变量。
将所有 排完序后,最终答案一定是一段前缀。
可以设计一个简单的 DP,记 为选长度为 的前缀,和为 的概率。
每一次和只会 或者 ,则有转移式:
这样做是 的。
考虑优化,令 为误差,我们断言,对于每一个 ,使得 的位置不会很多。
转移时只需舍去 的状态,精细实现即可通过本题。
下面给出这个做法的复杂度证明。
考虑对于每一个 分析复杂度。事实上,事件 所有随机变量取值为 或 ,且和 等价于事件 所有随机变量取值为 或 ,且和 ,这样我们就把问题转化为了若干次的 分布,此时和的期望 。
容易注意到的是,满足 的 应该是一段连续区间,不妨设这一段区间为 ,且 。
代入 可以得到:
不等式两边同时取对数的相反数:
解二次不等式组得:
舍去常数,由于 ,所以可以视为 同阶,且 相对于 是小量,所以:
取等号时最优,得到满足条件的区间为 ,即对于每个 ,合法状态数为 个。
综上,总时间复杂度为 。
经过测试,实际 的值大约取到 ,此时总时间复杂度不超过 。
核心代码:
Cconstexpr int N=5e4+5;
constexpr double eps=1e-11;
namespace Junounly
{
int n,K;
double p[N];
vector<pair<int,double> > q[2];
void main()
{
scanf("%d%d",&n,&K);
for(int i=1;i<=n;i++) scanf("%lf",&p[i]);
sort(p+1,p+n+1,greater<double>());
q[0].emplace_back(0,1);
double res=0;
for(int i=1,op=0;i<=n;i++,op^=1)
{
for(auto [X,Y]:q[op])
{
int x=X-1;double y=Y*(1-p[i]);
if(y>eps)
{
if(q[op^1].size()&&q[op^1][q[op^1].size()-1].first==x) q[op^1][q[op^1].size()-1].second+=y;
else if(q[op^1].size()>1&&q[op^1][q[op^1].size()-2].first==x) q[op^1][q[op^1].size()-2].second+=y;
else q[op^1].emplace_back(x,y);
}
x=X+1;y=Y*p[i];
if(y>eps) q[op^1].emplace_back(x,y);
}
q[op].clear();
double now=0;
for(auto [X,Y]:q[op^1])
if(X>=K) now+=Y;
res=max(res,now);
}
printf("%.11lf\n",res);
}
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...