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