题意:
给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);
}
}