#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <map>
#include <queue>
#include <set>
#include <numeric>
#include <stack>
#include <iomanip>
using namespace std;
using ll = long long int;
#define debug(x) cout << #x << " = " << x << endl;
void gen(int n, int k, int zacznij, vector<int>&comb, vector<vector<int>>& zapis)
{
if (comb.size() == k)
{
zapis.push_back(comb);
return;
}
for (int i = zacznij; i < n; ++i) {
comb.push_back(i);
gen(n, k, i + 1, comb, zapis);
comb.pop_back();
}
}
void solve()
{
int n, t;
cin >> n >> t;
vector<double>zd(n);
vector<double>przeciw(n);
for (int i = 0; i < n; i++)
{
cin >> zd[i];
}
sort(zd.begin(), zd.end());
reverse(zd.begin(), zd.end());
for (int i = 0; i < n; i++)
{
przeciw[i] = 1.0 - zd[i];
}
double odp = 0;
double bezblednie = 1;
for (int i = 0; i < t; i++)
{
bezblednie *= zd[i];//bezblednie dla pierwszych t
}
odp = max(odp, bezblednie);
for (int ile = t; ile < n; ile += 2)//i= liczba zadan z gory
{
if (ile > t)
{
bezblednie *= zd[ile - 1];
bezblednie *= zd[ile - 2];
}
int ilebledow = (ile - t) >> 1;
double posrednia = bezblednie;//poczatkowo bezblednie i dodaj z bledami
if (ilebledow >= 1)
{
vector<vector<int>>zapis;
vector<int>comb;
gen(ile, ilebledow, 0, comb, zapis);
for (int i = 0; i < zapis.size(); i++)
{
double kopia = bezblednie;
for (int j = 0; j < zapis[i].size(); j++)
{
kopia /= zd[zapis[i][j]];
kopia *= (przeciw[zapis[i][j]]);
}
posrednia += kopia;
odp = max(posrednia, odp);
}
}
}
cout << fixed << setprecision(9) << odp << "\n";
}
int main()
{
ios::sync_with_stdio(false);
//int t;
//cin >> t;
//while (t--)
//{
solve();
//}
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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <algorithm> #include <vector> #include <cmath> #include <map> #include <queue> #include <set> #include <numeric> #include <stack> #include <iomanip> using namespace std; using ll = long long int; #define debug(x) cout << #x << " = " << x << endl; void gen(int n, int k, int zacznij, vector<int>&comb, vector<vector<int>>& zapis) { if (comb.size() == k) { zapis.push_back(comb); return; } for (int i = zacznij; i < n; ++i) { comb.push_back(i); gen(n, k, i + 1, comb, zapis); comb.pop_back(); } } void solve() { int n, t; cin >> n >> t; vector<double>zd(n); vector<double>przeciw(n); for (int i = 0; i < n; i++) { cin >> zd[i]; } sort(zd.begin(), zd.end()); reverse(zd.begin(), zd.end()); for (int i = 0; i < n; i++) { przeciw[i] = 1.0 - zd[i]; } double odp = 0; double bezblednie = 1; for (int i = 0; i < t; i++) { bezblednie *= zd[i];//bezblednie dla pierwszych t } odp = max(odp, bezblednie); for (int ile = t; ile < n; ile += 2)//i= liczba zadan z gory { if (ile > t) { bezblednie *= zd[ile - 1]; bezblednie *= zd[ile - 2]; } int ilebledow = (ile - t) >> 1; double posrednia = bezblednie;//poczatkowo bezblednie i dodaj z bledami if (ilebledow >= 1) { vector<vector<int>>zapis; vector<int>comb; gen(ile, ilebledow, 0, comb, zapis); for (int i = 0; i < zapis.size(); i++) { double kopia = bezblednie; for (int j = 0; j < zapis[i].size(); j++) { kopia /= zd[zapis[i][j]]; kopia *= (przeciw[zapis[i][j]]); } posrednia += kopia; odp = max(posrednia, odp); } } } cout << fixed << setprecision(9) << odp << "\n"; } int main() { ios::sync_with_stdio(false); //int t; //cin >> t; //while (t--) //{ solve(); //} return 0; } |
English