#include <bits/stdc++.h> using namespace std; const int N = 50004; long double p[N]; long double left_dp[2*N], right_dp[2*N]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); int n, t; cin >> n >> t; for(int i = 1; i <= n; i++) { cin >> p[i]; } if(t % 2 != n % 2) n--; sort(p + 1, p + n + 1, greater<long double>()); int zero = n+2; for(int i = 0; i <= 2*zero; i++) { left_dp[i] = 0; } int start; if(t % 2 == 0) { start = 1; left_dp[zero] = 1; } else { start = 2; left_dp[zero + 1] = p[1]; left_dp[zero - 1] = 1 - p[1]; } // cout << "n: " << n << "\n"; // cout << "p[i]: "; // for(int i = 1; i <= n; i++) { // cout << p[i] << " "; // } // cout << "start: " << start << "\n"; long double best = 0; long double sum = 0; for(int pkt = zero+t; pkt <= zero+n; pkt += 2) { sum += left_dp[pkt]; } best = max(best, sum); for(int x = start; x < n; x += 2) { long double p1 = p[x], p2 = p[x + 1]; for(int pkt = zero-x-1; pkt <= zero+x+1; pkt += 2) { // mozna zdoybc max x+1 pkt right_dp[pkt] = left_dp[pkt - 2]*p1*p2 + left_dp[pkt]*(p1+p2-2*p1*p2) + left_dp[pkt + 2]*(1-p1)*(1-p2); } for(int pkt = zero-x-1; pkt <= zero+x+1; pkt += 2) { left_dp[pkt] = right_dp[pkt]; } long double sum = 0; for(int pkt = zero+t; pkt <= zero+n; pkt += 2) { sum += left_dp[pkt]; } best = max(best, sum); } cout << fixed << setprecision(20) << best << "\n"; 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 74 75 76 77 78 79 80 | #include <bits/stdc++.h> using namespace std; const int N = 50004; long double p[N]; long double left_dp[2*N], right_dp[2*N]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); int n, t; cin >> n >> t; for(int i = 1; i <= n; i++) { cin >> p[i]; } if(t % 2 != n % 2) n--; sort(p + 1, p + n + 1, greater<long double>()); int zero = n+2; for(int i = 0; i <= 2*zero; i++) { left_dp[i] = 0; } int start; if(t % 2 == 0) { start = 1; left_dp[zero] = 1; } else { start = 2; left_dp[zero + 1] = p[1]; left_dp[zero - 1] = 1 - p[1]; } // cout << "n: " << n << "\n"; // cout << "p[i]: "; // for(int i = 1; i <= n; i++) { // cout << p[i] << " "; // } // cout << "start: " << start << "\n"; long double best = 0; long double sum = 0; for(int pkt = zero+t; pkt <= zero+n; pkt += 2) { sum += left_dp[pkt]; } best = max(best, sum); for(int x = start; x < n; x += 2) { long double p1 = p[x], p2 = p[x + 1]; for(int pkt = zero-x-1; pkt <= zero+x+1; pkt += 2) { // mozna zdoybc max x+1 pkt right_dp[pkt] = left_dp[pkt - 2]*p1*p2 + left_dp[pkt]*(p1+p2-2*p1*p2) + left_dp[pkt + 2]*(1-p1)*(1-p2); } for(int pkt = zero-x-1; pkt <= zero+x+1; pkt += 2) { left_dp[pkt] = right_dp[pkt]; } long double sum = 0; for(int pkt = zero+t; pkt <= zero+n; pkt += 2) { sum += left_dp[pkt]; } best = max(best, sum); } cout << fixed << setprecision(20) << best << "\n"; return 0; } |