#include <iostream>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <iomanip>
#include <cassert>
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
int n;
int t;
std::cin >> n >> t;
std::vector<double> szanse;
for (int i = 0; i < n; ++i)
{
double szansa;
std::cin >> szansa;
szanse.push_back(szansa);
}
std::sort(szanse.begin(), szanse.end());
std::reverse(szanse.begin(), szanse.end());
std::vector<double> wspolczynnikiWielomianu(n+1, 0.0);
wspolczynnikiWielomianu[0] = 1;
std::vector<double> noweWspolczynnikiWielomianu(n + 1, 0.0);
double maxProbality = 0.0;
double lastProbability = -1.0;
for (int stopien = 1; stopien <= n; ++stopien)
{
double szansa = szanse[stopien - 1];
double szansaPorazki = (1 - szanse[stopien - 1]);
for (int i = 0; i < stopien+1; ++i)
{
noweWspolczynnikiWielomianu[i] = 0.0;
}
for (int i = 0; i < stopien; ++i)
{
noweWspolczynnikiWielomianu[i] += szansa * wspolczynnikiWielomianu[i];
}
for (int i = 0; i < stopien; ++i)
{
noweWspolczynnikiWielomianu[i + 1] += szansaPorazki * wspolczynnikiWielomianu[i];
}
/*std::cout << "stopien" << stopien << "\n";
for (int i = 0; i <= stopien; ++i)
{
std::cout << i << "=" << noweWspolczynnikiWielomianu[i] << "\n";
}*/
if (stopien >= t)
{
if (lastProbability < 0.0)
{
lastProbability = noweWspolczynnikiWielomianu[0];
maxProbality = std::max(maxProbality, lastProbability);
}
else
{
int iloscInteresujacych = (stopien - t) / 2;
int lastIloscInteresujacych = (stopien -1 - t) / 2;
if (iloscInteresujacych == lastIloscInteresujacych)
lastProbability -= szansaPorazki * wspolczynnikiWielomianu[(stopien - 1 - t) / 2];
else
lastProbability += szansa * wspolczynnikiWielomianu[(stopien + 1 - t) / 2];
maxProbality = std::max(maxProbality, lastProbability);
}
}
/*if (stopien >= t)
{
double probability = 0.0;
int lastInteresting = (stopien - t) / 2;
for (int i = 0; i <= lastInteresting; ++i)
{
probability += noweWspolczynnikiWielomianu[i];
}
assert(std::abs(lastProbability - probability) < 0.000000001);
maxProbality = std::max(maxProbality, probability);
}*/
wspolczynnikiWielomianu = noweWspolczynnikiWielomianu;
}
std::cout << std::fixed << std::setprecision(7) << maxProbality;
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 | #include <iostream> #include <vector> #include <cstdlib> #include <algorithm> #include <iomanip> #include <cassert> int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int n; int t; std::cin >> n >> t; std::vector<double> szanse; for (int i = 0; i < n; ++i) { double szansa; std::cin >> szansa; szanse.push_back(szansa); } std::sort(szanse.begin(), szanse.end()); std::reverse(szanse.begin(), szanse.end()); std::vector<double> wspolczynnikiWielomianu(n+1, 0.0); wspolczynnikiWielomianu[0] = 1; std::vector<double> noweWspolczynnikiWielomianu(n + 1, 0.0); double maxProbality = 0.0; double lastProbability = -1.0; for (int stopien = 1; stopien <= n; ++stopien) { double szansa = szanse[stopien - 1]; double szansaPorazki = (1 - szanse[stopien - 1]); for (int i = 0; i < stopien+1; ++i) { noweWspolczynnikiWielomianu[i] = 0.0; } for (int i = 0; i < stopien; ++i) { noweWspolczynnikiWielomianu[i] += szansa * wspolczynnikiWielomianu[i]; } for (int i = 0; i < stopien; ++i) { noweWspolczynnikiWielomianu[i + 1] += szansaPorazki * wspolczynnikiWielomianu[i]; } /*std::cout << "stopien" << stopien << "\n"; for (int i = 0; i <= stopien; ++i) { std::cout << i << "=" << noweWspolczynnikiWielomianu[i] << "\n"; }*/ if (stopien >= t) { if (lastProbability < 0.0) { lastProbability = noweWspolczynnikiWielomianu[0]; maxProbality = std::max(maxProbality, lastProbability); } else { int iloscInteresujacych = (stopien - t) / 2; int lastIloscInteresujacych = (stopien -1 - t) / 2; if (iloscInteresujacych == lastIloscInteresujacych) lastProbability -= szansaPorazki * wspolczynnikiWielomianu[(stopien - 1 - t) / 2]; else lastProbability += szansa * wspolczynnikiWielomianu[(stopien + 1 - t) / 2]; maxProbality = std::max(maxProbality, lastProbability); } } /*if (stopien >= t) { double probability = 0.0; int lastInteresting = (stopien - t) / 2; for (int i = 0; i <= lastInteresting; ++i) { probability += noweWspolczynnikiWielomianu[i]; } assert(std::abs(lastProbability - probability) < 0.000000001); maxProbality = std::max(maxProbality, probability); }*/ wspolczynnikiWielomianu = noweWspolczynnikiWielomianu; } std::cout << std::fixed << std::setprecision(7) << maxProbality; return 0; } |
English