//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'; } |