#include <bits/stdc++.h>
using namespace std;
#define _DEBUG
#ifdef _DEBUG
template<typename T1, typename T2> auto& operator<<(ostream& o, pair<T1, T2> a) { return o << "(" << a.first << ", " << a.second << ")"; }
template<typename T, typename OS> auto& operator<<(OS& o, T a) { o << "{"; for (auto b : a) o << b << ", "; return o << "}"; }
#define dbg(x...) cerr << "[" #x "]: ", [](auto... args) { ((cerr << args << ", "),...) << "\n"; }(x)
#else
#define dbg(...)
#endif
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define F first
#define S second
using ll = long long;
using ld = double;
using pll = pair<ll,ll>;
using vi = vector<int>;
int main() {
cin.tie(0)->sync_with_stdio(0);
ll n, t;
cin >> n >> t;
vector<ld> v(n);
for(ll i = 0 ; i < n ; ++i) cin >> v[i];
sort(all(v), greater<>());
ll m = (n+t)/2 + 2;
m = min(m, n);
vector<ld> dp(m+2);
dp[0] = 1-v[0];
dp[1] = 1;
ld ans = 0;
ll tr = sqrt(n);
ll ti = 1;
if(t == 0) ans = 1;
if(t == 1) ans = v[0];
for(ll i = 1 ; i < n ; ++i) {
ti = max(ti, i/2-tr);
while(ti < i-1 && dp[ti] < 1e-9) ti++;
for(ll j = min(m, i) ; j >= ti ; --j) {
dp[j] = dp[j]*(1-v[i]) + dp[j-1]*v[i];
}
if(i+1 <= m)
dp[i+1] = 1;
dp[0] = dp[0]*(1-v[i]);
if(i+1 >= t)
ans = max(ans, 1 - dp[(i+t)/2]);
}
cout << std::fixed << std::setprecision(7) << ans << '\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 51 52 53 54 55 56 57 58 59 | #include <bits/stdc++.h> using namespace std; #define _DEBUG #ifdef _DEBUG template<typename T1, typename T2> auto& operator<<(ostream& o, pair<T1, T2> a) { return o << "(" << a.first << ", " << a.second << ")"; } template<typename T, typename OS> auto& operator<<(OS& o, T a) { o << "{"; for (auto b : a) o << b << ", "; return o << "}"; } #define dbg(x...) cerr << "[" #x "]: ", [](auto... args) { ((cerr << args << ", "),...) << "\n"; }(x) #else #define dbg(...) #endif #define sz(x) ((int)(x).size()) #define all(x) (x).begin(), (x).end() #define F first #define S second using ll = long long; using ld = double; using pll = pair<ll,ll>; using vi = vector<int>; int main() { cin.tie(0)->sync_with_stdio(0); ll n, t; cin >> n >> t; vector<ld> v(n); for(ll i = 0 ; i < n ; ++i) cin >> v[i]; sort(all(v), greater<>()); ll m = (n+t)/2 + 2; m = min(m, n); vector<ld> dp(m+2); dp[0] = 1-v[0]; dp[1] = 1; ld ans = 0; ll tr = sqrt(n); ll ti = 1; if(t == 0) ans = 1; if(t == 1) ans = v[0]; for(ll i = 1 ; i < n ; ++i) { ti = max(ti, i/2-tr); while(ti < i-1 && dp[ti] < 1e-9) ti++; for(ll j = min(m, i) ; j >= ti ; --j) { dp[j] = dp[j]*(1-v[i]) + dp[j-1]*v[i]; } if(i+1 <= m) dp[i+1] = 1; dp[0] = dp[0]*(1-v[i]); if(i+1 >= t) ans = max(ans, 1 - dp[(i+t)/2]); } cout << std::fixed << std::setprecision(7) << ans << '\n'; return 0; } |
English