#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;
}
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; } |
English