题意:
给n个物品,每个物品有一个被选中,任选k个,怎么选才能使从k个物品中选一个物品的概率最大
思路:
因为这个式子由两部分组成,一部分是累乘一部分累加,所以可以将这个式子拆开来写
这样枚举i从1到n即可
但是a[1]=1.0的时候,1-a[1]=0,这样前缀和就不对了(除零错误),需要特判
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
double p[maxn],sum[maxn],mul[maxn]={1};
int main(){
int t;scanf("%d",&t);
while(t--){
int n;scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lf",&p[i]);
}
sort(p+1,p+n+1,greater<double>());
if(p[1]==1){
printf("%.12lf",1.0);
continue;
}
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+p[i]/(1-p[i]);
mul[i]=mul[i-1]*(1-p[i]);
}
double ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,sum[i]*mul[i]);
}
printf("%.12lf\n",ans);
}
}
本文探讨了一个涉及概率计算的问题,即如何在给定的物品集合中选取k个物品,使得从中随机选择一个物品的概率达到最大。文章提供了一种算法思路,通过拆分公式并使用排序、前缀和等技巧,避免了除零错误,最终实现了概率的最大化。
1014

被折叠的 条评论
为什么被折叠?



