#include <bits/stdc++.h>
using namespace std;
typedef int ll;
typedef double ld;
#define vc vector
#define st first
#define nd second
#define pll pair<ll, ll>
#define sz(a) (ll)a.size()
#define all(a) a.begin(), a.end()
#define pu push
#define pub push_back
#define pob pop_back
#define em emplace
#define emb emplace_back
void program() {
ll n, k;
cin >> n >> k;
vc<ld> p(n);
for (ld &pi : p)
cin >> pi;
sort(all(p), [&](ld &a, ld &b) {
return a > b;
});
const ld EPS = 1e-12;
vc<pair<ll, ld>> dp;
dp.pub({0, 1.0});
ld ans = 0.0;
for (ll i = 1; i <= n; i++) {
vc<pair<ll, ld>> tmp = {{dp[0].st - 1, 0.0}};
for (auto &[j, x] : dp) {
tmp.back().nd += x * (1 - p[i - 1]);
tmp.pub({j + 1, x * p[i - 1]});
}
ll l = 0;
while (tmp[l].nd < EPS)
l++;
while (tmp.back().nd < EPS)
tmp.pob();
dp.clear();
ld sum = 0.0;
for (ll j = l; j < sz(tmp); j++) {
dp.pub(tmp[j]);
if (tmp[j].st >= k)
sum += tmp[j].nd;
}
ans = max(ans, sum);
}
cout << fixed << setprecision(8) << ans << "\n";
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
program();
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 51 52 53 54 55 56 57 58 59 60 61 | #include <bits/stdc++.h> using namespace std; typedef int ll; typedef double ld; #define vc vector #define st first #define nd second #define pll pair<ll, ll> #define sz(a) (ll)a.size() #define all(a) a.begin(), a.end() #define pu push #define pub push_back #define pob pop_back #define em emplace #define emb emplace_back void program() { ll n, k; cin >> n >> k; vc<ld> p(n); for (ld &pi : p) cin >> pi; sort(all(p), [&](ld &a, ld &b) { return a > b; }); const ld EPS = 1e-12; vc<pair<ll, ld>> dp; dp.pub({0, 1.0}); ld ans = 0.0; for (ll i = 1; i <= n; i++) { vc<pair<ll, ld>> tmp = {{dp[0].st - 1, 0.0}}; for (auto &[j, x] : dp) { tmp.back().nd += x * (1 - p[i - 1]); tmp.pub({j + 1, x * p[i - 1]}); } ll l = 0; while (tmp[l].nd < EPS) l++; while (tmp.back().nd < EPS) tmp.pob(); dp.clear(); ld sum = 0.0; for (ll j = l; j < sz(tmp); j++) { dp.pub(tmp[j]); if (tmp[j].st >= k) sum += tmp[j].nd; } ans = max(ans, sum); } cout << fixed << setprecision(8) << ans << "\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); program(); return 0; } |
English