#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; } |