#include <bits/stdc++.h> using namespace std; double solve(int n, int t, vector<double>& p) { sort(p.rbegin(), p.rend()); double max_prob = 0.0; for (int k = t; k <= n; ++k) { int c = (t + k + 1) / 2; if (c > k) continue; vector<double> dp(c + 1, 0.0); dp[0] = 1.0; for (int i = 0; i < k; ++i) { double prob = p[i]; for (int j = min(i + 1, c); j > 0; --j) { dp[j] = dp[j] * (1 - prob) + dp[j - 1] * prob; } } double sum = 0.0; for (int m = c; m <= k; ++m) { if (m <= c) sum += dp[m]; } if (sum > max_prob) { max_prob = sum; } } return max_prob; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n, t; cin >> n >> t; vector<double> p(n); for (int i = 0; i < n; ++i) { cin >> p[i]; } cout << fixed << setprecision(20) << solve(n, t, p) << "\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 | #include <bits/stdc++.h> using namespace std; double solve(int n, int t, vector<double>& p) { sort(p.rbegin(), p.rend()); double max_prob = 0.0; for (int k = t; k <= n; ++k) { int c = (t + k + 1) / 2; if (c > k) continue; vector<double> dp(c + 1, 0.0); dp[0] = 1.0; for (int i = 0; i < k; ++i) { double prob = p[i]; for (int j = min(i + 1, c); j > 0; --j) { dp[j] = dp[j] * (1 - prob) + dp[j - 1] * prob; } } double sum = 0.0; for (int m = c; m <= k; ++m) { if (m <= c) sum += dp[m]; } if (sum > max_prob) { max_prob = sum; } } return max_prob; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n, t; cin >> n >> t; vector<double> p(n); for (int i = 0; i < n; ++i) { cin >> p[i]; } cout << fixed << setprecision(20) << solve(n, t, p) << "\n"; return 0; } |