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