//PROBLEM 2C
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int D = 1000;
int main() {
cin.tie(0)->sync_with_stdio(0);
int n, t;
double ans = 0;
cin >> n >> t;
vector<double> P(n);
for(auto &i : P) cin >> i;
sort(all(P), greater<>());
double expect = 0;
int cur_L = floor(expect - D), cur_R = ceil(expect + D);
vector<double> cur_dp(2*D + 10);//DP is prefix sum, currently have 0 with prob 1
auto nxt_dp = cur_dp;
for(int i = 0; i <= cur_R; i++) {
cur_dp[i - cur_L] = 1;
}
auto get = [&](int i) -> double {
if(i < cur_L) return 0;
if(i > cur_R) return 1;
return cur_dp[i - cur_L];
};
int total = 0;
for(auto p : P) {
total++;
double q = 1. - p;
expect += p;
int nxt_L = floor(expect - D), nxt_R = ceil(expect + D);
fill(all(nxt_dp), 0);
for(int i = nxt_L; i <= nxt_R; i++) {
nxt_dp[i - nxt_L] = get(i - 1) * p + get(i) * q;
}
swap(cur_dp, nxt_dp);
cur_L = nxt_L, cur_R = nxt_R;
int must_solve = (t + total + 1) / 2;
ans = max(ans, 1. - get(must_solve - 1));
// assert(cur_dp[0] < 1e-12 && (1 - cur_dp[cur_R - cur_L]) < 1e-12);
}
cout << fixed << setprecision(15) << ans << '\n';
}
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 | //PROBLEM 2C #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() typedef long long ll; typedef pair<int, int> pii; typedef vector<int> vi; const int D = 1000; int main() { cin.tie(0)->sync_with_stdio(0); int n, t; double ans = 0; cin >> n >> t; vector<double> P(n); for(auto &i : P) cin >> i; sort(all(P), greater<>()); double expect = 0; int cur_L = floor(expect - D), cur_R = ceil(expect + D); vector<double> cur_dp(2*D + 10);//DP is prefix sum, currently have 0 with prob 1 auto nxt_dp = cur_dp; for(int i = 0; i <= cur_R; i++) { cur_dp[i - cur_L] = 1; } auto get = [&](int i) -> double { if(i < cur_L) return 0; if(i > cur_R) return 1; return cur_dp[i - cur_L]; }; int total = 0; for(auto p : P) { total++; double q = 1. - p; expect += p; int nxt_L = floor(expect - D), nxt_R = ceil(expect + D); fill(all(nxt_dp), 0); for(int i = nxt_L; i <= nxt_R; i++) { nxt_dp[i - nxt_L] = get(i - 1) * p + get(i) * q; } swap(cur_dp, nxt_dp); cur_L = nxt_L, cur_R = nxt_R; int must_solve = (t + total + 1) / 2; ans = max(ans, 1. - get(must_solve - 1)); // assert(cur_dp[0] < 1e-12 && (1 - cur_dp[cur_R - cur_L]) < 1e-12); } cout << fixed << setprecision(15) << ans << '\n'; } |
English