1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<iostream>
#include<algorithm>
#include<vector>
#include<unordered_map>
#include<map>
#include<iomanip>
using namespace std;
int n,t;
#define REP(i,n) for(int i=0;i<n;++i)
double p[65536];
void raise(double&a,double b){
  if(b>a)a=b;
}
map<pair<int,int>,double>memo;
double fun(int x,int t){
  auto key=make_pair(x,t);
  if(memo.count(key))return memo[key];
  if(!x)return memo[key]=t<=0;
  return memo[key]=p[n-x]*fun(x-1,t-1)+(1-p[n-x])*fun(x-1,t+1);
}
int main(){
  cin>>n>>t;
  REP(i,n)cin>>p[i];
  sort(p,p+n);
  double res=0;
  int a=t,d=n;
  while(a+3<d){
    int b=a+(d-a)/3;
    int c=a+2*(d-a)/3;
//    cerr<<a<<' '<<b<<' '<<c<<' '<<d<<endl;
    if(fun(b,t)<fun(c,t)){
      a=b;
    }else{
      d=c;
    }
  }
  for(int ile=a;ile<=d;++ile){
    double wyszlo=fun(ile,t);
    raise(res,wyszlo);
  }
  cout<<fixed<<setprecision(20)<<res;
  return 0;
}