#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
const int NMAX = 50007;
pair<double, double> p[NMAX];
double dp[NMAX];
double sum(int n, int k){
double curr_sum = 0;
double final_sum = 0;
if(k > 0){
for(int i=0;i<n;i++){
dp[i] = p[i].second;
curr_sum += p[i].second;
}
final_sum += curr_sum;
}
for(int i=1;i<k;i++){
double temp_sum = 0;
for(int j=0;j<n;j++){
curr_sum -= dp[j];
dp[j] = p[j].second * curr_sum;
temp_sum += dp[j];
}
curr_sum = temp_sum;
final_sum += curr_sum;
}
return final_sum;
}
int main(){
int n, t;
double q, answer = 0;
cin>>n>>t;
for(int i=0;i<n;i++){
cin>>q;
p[i] = {q, (1-q)/q};
}
sort(p, p+n, greater<pair<double,double>>());
double curr_p = 1;
for(int i=0;i<t;i++){
curr_p *= p[i].first;
}
answer = max(answer, curr_p);
for(int i=t+1;i<n;i+=2){
curr_p *= (p[i].first * p[i-1].first);
if(p[i].first == 0){
break;
}
double prob = curr_p * ((double)1 + sum(i+1, (i+1-t)/2));
if(prob < answer){
break;
}
answer = max(prob, answer);
}
cout<<fixed<<setprecision(10)<<answer;
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | #include <iostream> #include <algorithm> #include <iomanip> using namespace std; const int NMAX = 50007; pair<double, double> p[NMAX]; double dp[NMAX]; double sum(int n, int k){ double curr_sum = 0; double final_sum = 0; if(k > 0){ for(int i=0;i<n;i++){ dp[i] = p[i].second; curr_sum += p[i].second; } final_sum += curr_sum; } for(int i=1;i<k;i++){ double temp_sum = 0; for(int j=0;j<n;j++){ curr_sum -= dp[j]; dp[j] = p[j].second * curr_sum; temp_sum += dp[j]; } curr_sum = temp_sum; final_sum += curr_sum; } return final_sum; } int main(){ int n, t; double q, answer = 0; cin>>n>>t; for(int i=0;i<n;i++){ cin>>q; p[i] = {q, (1-q)/q}; } sort(p, p+n, greater<pair<double,double>>()); double curr_p = 1; for(int i=0;i<t;i++){ curr_p *= p[i].first; } answer = max(answer, curr_p); for(int i=t+1;i<n;i+=2){ curr_p *= (p[i].first * p[i-1].first); if(p[i].first == 0){ break; } double prob = curr_p * ((double)1 + sum(i+1, (i+1-t)/2)); if(prob < answer){ break; } answer = max(prob, answer); } cout<<fixed<<setprecision(10)<<answer; return 0; } |
English