#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
int main() {
int n;
int t;
std::cin >> n >> t;
std::vector<double> prob(n, 0);
// std::vector<double> dp(n * (n + 1), 0);
std::vector<double> dpPrev(n, 0);
std::vector<double> dpNow(n, 0);
for (int i = 0; i < n; ++i) {
double p;
std::cin >> p;
prob[i] = p;
}
std::sort(prob.begin(), prob.end(), std::greater{});
// dp[1*n + 0] = prob[0];
dpNow[0] = prob[0];
for (int i = 0; i < n; ++i) {
// dp[0*n + i] = 1;
dpPrev[i] = 1;
}
double best = 0;
int j = 0;
int k = (j + t + 2)/2;
bool done = false;
for (int u = 1; u < n + 1 && !done; ++u) {
for (int i = 1; i < n; ++i) {
// dp[u*n + i] = prob[i] * dp[(u - 1)*n + i - 1]
// + (1.0 - prob[i]) * dp[u*n + i - 1];
dpNow[i] = prob[i] * dpPrev[i - 1]
+ (1.0 - prob[i]) * dpNow[i - 1];
}
while (u == k) {
best = std::max(best, dpNow[j]);
++j;
k = (j + t + 2)/2;
if (k >= n || j >= n) {
done = true;
break;
}
}
dpPrev.swap(dpNow);
dpNow[0] = 0;
}
/*
double best = 0;
for (int i = 0; (i + t + 2)/2 < n; ++i) {
double maybe = dp[((i + t + 2)/2)*n + i];
if (maybe > best) {
best = maybe;
}
}
*/
std::cout << std::fixed << std::setprecision(10) << best << std::endl;
}
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 | #include <iostream> #include <iomanip> #include <vector> #include <algorithm> int main() { int n; int t; std::cin >> n >> t; std::vector<double> prob(n, 0); // std::vector<double> dp(n * (n + 1), 0); std::vector<double> dpPrev(n, 0); std::vector<double> dpNow(n, 0); for (int i = 0; i < n; ++i) { double p; std::cin >> p; prob[i] = p; } std::sort(prob.begin(), prob.end(), std::greater{}); // dp[1*n + 0] = prob[0]; dpNow[0] = prob[0]; for (int i = 0; i < n; ++i) { // dp[0*n + i] = 1; dpPrev[i] = 1; } double best = 0; int j = 0; int k = (j + t + 2)/2; bool done = false; for (int u = 1; u < n + 1 && !done; ++u) { for (int i = 1; i < n; ++i) { // dp[u*n + i] = prob[i] * dp[(u - 1)*n + i - 1] // + (1.0 - prob[i]) * dp[u*n + i - 1]; dpNow[i] = prob[i] * dpPrev[i - 1] + (1.0 - prob[i]) * dpNow[i - 1]; } while (u == k) { best = std::max(best, dpNow[j]); ++j; k = (j + t + 2)/2; if (k >= n || j >= n) { done = true; break; } } dpPrev.swap(dpNow); dpNow[0] = 0; } /* double best = 0; for (int i = 0; (i + t + 2)/2 < n; ++i) { double maybe = dp[((i + t + 2)/2)*n + i]; if (maybe > best) { best = maybe; } } */ std::cout << std::fixed << std::setprecision(10) << best << std::endl; } |
English