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