#include<iostream> #include<vector> #include<algorithm> #include<iomanip> using namespace std; bool comp (long double a, long double b) { return a > b; } int main() { int n, t; cin >> n >> t; vector<long double> probs(n); for (int i = 0; i < n; i++) { long double x; cin >> x; probs[i] = x; } sort(probs.begin(), probs.end(), comp); vector<long double> even_pts_pr(2 * n + 1, 0.0L); vector<long double> odd_pts_pr(2 * n + 1, 0.0L); int initial_points = n; int required_points = n + t; even_pts_pr[n] = 1.0L; long double max_prob = 0.0L; for (int i = 0; i < n; i++) { long double prob = 0.0L; if (i % 2 == 0) { for (int j = n - i - 1; j <= n + i + 1; j += 2) { odd_pts_pr[j] = even_pts_pr[j - 1] * probs[i] + even_pts_pr[j + 1] - even_pts_pr[j+1] * probs[i]; if (j >= required_points) { prob += odd_pts_pr[j]; } } } else if (i % 2 == 1) { for (int j = n - i - 1; j <= n + i + 1; j += 2) { even_pts_pr[j] = odd_pts_pr[j - 1] * probs[i] + odd_pts_pr[j + 1] - odd_pts_pr[j+1] * probs[i]; if (j >= required_points) { prob += even_pts_pr[j]; } } } if (prob > max_prob) { max_prob = prob; } } cout << setprecision(10) << max_prob; }
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 | #include<iostream> #include<vector> #include<algorithm> #include<iomanip> using namespace std; bool comp (long double a, long double b) { return a > b; } int main() { int n, t; cin >> n >> t; vector<long double> probs(n); for (int i = 0; i < n; i++) { long double x; cin >> x; probs[i] = x; } sort(probs.begin(), probs.end(), comp); vector<long double> even_pts_pr(2 * n + 1, 0.0L); vector<long double> odd_pts_pr(2 * n + 1, 0.0L); int initial_points = n; int required_points = n + t; even_pts_pr[n] = 1.0L; long double max_prob = 0.0L; for (int i = 0; i < n; i++) { long double prob = 0.0L; if (i % 2 == 0) { for (int j = n - i - 1; j <= n + i + 1; j += 2) { odd_pts_pr[j] = even_pts_pr[j - 1] * probs[i] + even_pts_pr[j + 1] - even_pts_pr[j+1] * probs[i]; if (j >= required_points) { prob += odd_pts_pr[j]; } } } else if (i % 2 == 1) { for (int j = n - i - 1; j <= n + i + 1; j += 2) { even_pts_pr[j] = odd_pts_pr[j - 1] * probs[i] + odd_pts_pr[j + 1] - odd_pts_pr[j+1] * probs[i]; if (j >= required_points) { prob += even_pts_pr[j]; } } } if (prob > max_prob) { max_prob = prob; } } cout << setprecision(10) << max_prob; } |