题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6693
对于0.5以下的概率x的贡献值最多只有到1/x个。
在有效的贡献范围内只要他的个数还没到就一直是有用的,直接计算就好了。
#include<bits/stdc++.h>
using namespace std;
double num[100000+10];
double my_max(double a,double b)
{
return a>b?a:b;
}
int main()
{
// freopen("c.in","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lf",&num[i]);
sort(num,num+n);
double sum=-1;
double aa=-1;
double ans=num[n-1];
for(int i=n-1;i>=0;i--)
{
ans=my_max(ans,num[i]);
if(num[i]<0.5)
{
if(sum==-1)
{
sum=num[i];
aa=1-num[i];
}
else
{
sum=(double)(aa*num[i]+(1-num[i])*sum);
aa*=(double)(1-num[i]);
}
ans=my_max(sum,ans);
}
// printf("%lf",ans);
}
printf("%.12lf\n",ans);
}
return 0;
}