#include <bits/stdc++.h>
using namespace std;
double oblicz_prawd(const vector<double>& p, long long min_sukcesow, long long idx = 0, long long sukcesy = 0, double akt_prawd = 1.0) {
int n = p.size();
if (idx == n)
return sukcesy >= min_sukcesow ? akt_prawd : 0.0;
if (sukcesy >= min_sukcesow)
return akt_prawd;
return oblicz_prawd(p, min_sukcesow, idx + 1, sukcesy + 1, akt_prawd * p[idx]) + oblicz_prawd(p, min_sukcesow, idx + 1, sukcesy, akt_prawd * (1 - p[idx]));
}
int main() {
int n, t;
cin >> n >> t;
vector<double> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
sort(v.begin(), v.end());
vector<double>values;
for (int i = n-1; i >= 0; i--) {
if(v[i] >= 0.5) {
values.push_back(v[i]);
}
}
if(!values.empty() && (values.size() - t) % 2 == 1) {
values.pop_back();
}
if(values.size() < t) {
for(int i = n-values.size()-1; i > n-t-1; i--) {
values.push_back(v[i]);
}
}
double result = oblicz_prawd(values, t+(values.size()-t)/2);
if(result < 0.000001) {
cout << "0\n";
return 0;
}
cout << result << endl;
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 | #include <bits/stdc++.h> using namespace std; double oblicz_prawd(const vector<double>& p, long long min_sukcesow, long long idx = 0, long long sukcesy = 0, double akt_prawd = 1.0) { int n = p.size(); if (idx == n) return sukcesy >= min_sukcesow ? akt_prawd : 0.0; if (sukcesy >= min_sukcesow) return akt_prawd; return oblicz_prawd(p, min_sukcesow, idx + 1, sukcesy + 1, akt_prawd * p[idx]) + oblicz_prawd(p, min_sukcesow, idx + 1, sukcesy, akt_prawd * (1 - p[idx])); } int main() { int n, t; cin >> n >> t; vector<double> v(n); for (int i = 0; i < n; i++) { cin >> v[i]; } sort(v.begin(), v.end()); vector<double>values; for (int i = n-1; i >= 0; i--) { if(v[i] >= 0.5) { values.push_back(v[i]); } } if(!values.empty() && (values.size() - t) % 2 == 1) { values.pop_back(); } if(values.size() < t) { for(int i = n-values.size()-1; i > n-t-1; i--) { values.push_back(v[i]); } } double result = oblicz_prawd(values, t+(values.size()-t)/2); if(result < 0.000001) { cout << "0\n"; return 0; } cout << result << endl; return 0; } |
English