#include <cstdio>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
int main()
{
int n, t;
vector<double> P;
scanf("%d%d", &n, &t);
P.resize(n);
for (int i = 0; i < n; i++)
scanf("%lf", &P[i]);
sort(P.begin(), P.end(), greater<double>());
double best = 0.0;
unordered_map<int, double> prev;
prev[0] = 1.0;
for (int i = 0; i < n; i++)
{
unordered_map<int, double> next;
for (int j = -(i + 1); j <= i + 1; j += 2)
next[j] = prev[j - 1] * P[i] + prev[j + 1] * (1 - P[i]);
double current = 0.0;
for (int j = t; j <= i + 1; j++)
current += next[j];
if (current > best)
best = current;
swap(prev, next);
}
printf("%.9lf\n", best);
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 | #include <cstdio> #include <vector> #include <algorithm> #include <unordered_map> using namespace std; int main() { int n, t; vector<double> P; scanf("%d%d", &n, &t); P.resize(n); for (int i = 0; i < n; i++) scanf("%lf", &P[i]); sort(P.begin(), P.end(), greater<double>()); double best = 0.0; unordered_map<int, double> prev; prev[0] = 1.0; for (int i = 0; i < n; i++) { unordered_map<int, double> next; for (int j = -(i + 1); j <= i + 1; j += 2) next[j] = prev[j - 1] * P[i] + prev[j + 1] * (1 - P[i]); double current = 0.0; for (int j = t; j <= i + 1; j++) current += next[j]; if (current > best) best = current; swap(prev, next); } printf("%.9lf\n", best); return 0; } |
English