#include <bits/stdc++.h> using namespace std; #define V vector #define Q queue #define PQ priority_queue #define ST stack #define UMAP unordered_map typedef long long LL; typedef double LD; typedef pair<int, int> PII; typedef V<int> VI; typedef V<V<int>> VVI; constexpr int MAXNT = 50'007; constexpr int MAXSIZE = MAXNT+MAXNT; LD prob[MAXSIZE]; LD prob2[MAXSIZE]; LD vals[MAXNT]; inline bool comp(LD a, LD b) { return a > b; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); for (int i = 0; i < MAXSIZE; ++i) prob[i] = 0; prob[MAXNT] = 1; int n, k; cin >> n >> k; for (int i = 0; i < n; ++i) cin >> vals[i]; sort(vals, vals+n, comp); LD best = 0; int l = MAXNT; int r = MAXNT; int z = k&1; if (z) { LD sum = 0; --l; ++r; int maxBord = MAXNT-(k>>1)-10; if ((l&1) && !(maxBord&1)) { --maxBord; } else if (!(l&1) && (maxBord&1)) { --maxBord; } for (int j = max(l, maxBord); j < r; j += 2) prob2[j] = prob[j+1]*(1-vals[0]); prob2[r] = 0; for (int j = max(l+2, maxBord); j <= r; j += 2) prob2[j] += prob[j-1]*vals[0]; for (int j = max(l, maxBord); j <= r; j += 2) { prob[j] = prob2[j]; if (prob[j] < 1e-12) prob[j] = 0; } while (prob[l] == 0) l += 2; while (prob[r] == 0) r -= 2; for (int j = r; j >= MAXNT + k; j -= 2) sum += prob[j]; best = max(best, sum); } for (int i = z; i+1 < n; i += 2) { LD sum = 0; l -= 2; r += 2; int maxBord = MAXNT-(k>>1)-10; if ((l&1) && !(maxBord&1)) { --maxBord; } else if (!(l&1) && (maxBord&1)) { --maxBord; } pair<LD,pair<LD,LD>> poly; poly.first = ((1-vals[i])*(1-vals[i+1])); poly.second.first = ((vals[i]*(1-vals[i+1]))+(vals[i+1]*(1-vals[i]))); poly.second.second = (vals[i]*vals[i+1]); prob2[r] = 0; for (int j = max(l, maxBord); j < r; j += 2) prob2[j] = prob[j+2]*poly.first; for (int j = max(l+2, maxBord); j < r; j += 2) prob2[j] += prob[j]*poly.second.first; for (int j = max(l+4, maxBord); j <= r; j += 2) prob2[j] += prob[j-2]*poly.second.second; for (int j = max(l, maxBord); j <= r; j += 2) prob[j] = prob2[j]; for (int j = r; j >= MAXNT + k; j -= 2) sum += prob[j]; best = max(best, sum); } cout << fixed << setprecision(9); cout << 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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | #include <bits/stdc++.h> using namespace std; #define V vector #define Q queue #define PQ priority_queue #define ST stack #define UMAP unordered_map typedef long long LL; typedef double LD; typedef pair<int, int> PII; typedef V<int> VI; typedef V<V<int>> VVI; constexpr int MAXNT = 50'007; constexpr int MAXSIZE = MAXNT+MAXNT; LD prob[MAXSIZE]; LD prob2[MAXSIZE]; LD vals[MAXNT]; inline bool comp(LD a, LD b) { return a > b; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); for (int i = 0; i < MAXSIZE; ++i) prob[i] = 0; prob[MAXNT] = 1; int n, k; cin >> n >> k; for (int i = 0; i < n; ++i) cin >> vals[i]; sort(vals, vals+n, comp); LD best = 0; int l = MAXNT; int r = MAXNT; int z = k&1; if (z) { LD sum = 0; --l; ++r; int maxBord = MAXNT-(k>>1)-10; if ((l&1) && !(maxBord&1)) { --maxBord; } else if (!(l&1) && (maxBord&1)) { --maxBord; } for (int j = max(l, maxBord); j < r; j += 2) prob2[j] = prob[j+1]*(1-vals[0]); prob2[r] = 0; for (int j = max(l+2, maxBord); j <= r; j += 2) prob2[j] += prob[j-1]*vals[0]; for (int j = max(l, maxBord); j <= r; j += 2) { prob[j] = prob2[j]; if (prob[j] < 1e-12) prob[j] = 0; } while (prob[l] == 0) l += 2; while (prob[r] == 0) r -= 2; for (int j = r; j >= MAXNT + k; j -= 2) sum += prob[j]; best = max(best, sum); } for (int i = z; i+1 < n; i += 2) { LD sum = 0; l -= 2; r += 2; int maxBord = MAXNT-(k>>1)-10; if ((l&1) && !(maxBord&1)) { --maxBord; } else if (!(l&1) && (maxBord&1)) { --maxBord; } pair<LD,pair<LD,LD>> poly; poly.first = ((1-vals[i])*(1-vals[i+1])); poly.second.first = ((vals[i]*(1-vals[i+1]))+(vals[i+1]*(1-vals[i]))); poly.second.second = (vals[i]*vals[i+1]); prob2[r] = 0; for (int j = max(l, maxBord); j < r; j += 2) prob2[j] = prob[j+2]*poly.first; for (int j = max(l+2, maxBord); j < r; j += 2) prob2[j] += prob[j]*poly.second.first; for (int j = max(l+4, maxBord); j <= r; j += 2) prob2[j] += prob[j-2]*poly.second.second; for (int j = max(l, maxBord); j <= r; j += 2) prob[j] = prob2[j]; for (int j = r; j >= MAXNT + k; j -= 2) sum += prob[j]; best = max(best, sum); } cout << fixed << setprecision(9); cout << best << '\n'; return 0; } |