#include <array> #include <iostream> #include <limits> #include <vector> struct oddzial_t { int zgrzytow; std::vector<short> zolnierze; }; int main() { short wszystkich; std::array<int, 45> permutacja; std::array<std::array<int, 45>, 45> zgrzyty; std::cin >> wszystkich; for (short i = 0; i < wszystkich; ++i) { std::cin >> permutacja[i]; --permutacja[i]; } std::vector<oddzial_t> oddzialy{}; for (short z = 0; z < wszystkich; ++z) { oddzialy.push_back({0, {z}}); for (short z2 = z + 1; z2 < wszystkich; ++z2) { zgrzyty[z][z2] = (permutacja[z] > permutacja[z2]); } } std::cout << 0 << ' ' << wszystkich << std::endl; std::vector<oddzial_t> nowe_oddzialy; for (short i = 1; i < wszystkich; ++i) { int min_zgrzytow = std::numeric_limits<int>::max(); int najlepszych_oddzialow = 0; for (const auto &oddzial: oddzialy) { for (int z = oddzial.zolnierze.back() + 1; z < wszystkich; ++z) { int zgrzytow = oddzial.zgrzytow; for (const auto &w_oddziale: oddzial.zolnierze) { zgrzytow += zgrzyty[w_oddziale][z]; } if (zgrzytow < min_zgrzytow) { min_zgrzytow = zgrzytow; najlepszych_oddzialow = 1; } else if (zgrzytow == min_zgrzytow) { ++najlepszych_oddzialow; } oddzial_t nowy_oddzial = {zgrzytow, oddzial.zolnierze}; nowy_oddzial.zolnierze.push_back(z); nowe_oddzialy.push_back(nowy_oddzial); } } std::cout << min_zgrzytow << ' ' << najlepszych_oddzialow << std::endl; oddzialy.clear(); oddzialy.swap(nowe_oddzialy); } }
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 | #include <array> #include <iostream> #include <limits> #include <vector> struct oddzial_t { int zgrzytow; std::vector<short> zolnierze; }; int main() { short wszystkich; std::array<int, 45> permutacja; std::array<std::array<int, 45>, 45> zgrzyty; std::cin >> wszystkich; for (short i = 0; i < wszystkich; ++i) { std::cin >> permutacja[i]; --permutacja[i]; } std::vector<oddzial_t> oddzialy{}; for (short z = 0; z < wszystkich; ++z) { oddzialy.push_back({0, {z}}); for (short z2 = z + 1; z2 < wszystkich; ++z2) { zgrzyty[z][z2] = (permutacja[z] > permutacja[z2]); } } std::cout << 0 << ' ' << wszystkich << std::endl; std::vector<oddzial_t> nowe_oddzialy; for (short i = 1; i < wszystkich; ++i) { int min_zgrzytow = std::numeric_limits<int>::max(); int najlepszych_oddzialow = 0; for (const auto &oddzial: oddzialy) { for (int z = oddzial.zolnierze.back() + 1; z < wszystkich; ++z) { int zgrzytow = oddzial.zgrzytow; for (const auto &w_oddziale: oddzial.zolnierze) { zgrzytow += zgrzyty[w_oddziale][z]; } if (zgrzytow < min_zgrzytow) { min_zgrzytow = zgrzytow; najlepszych_oddzialow = 1; } else if (zgrzytow == min_zgrzytow) { ++najlepszych_oddzialow; } oddzial_t nowy_oddzial = {zgrzytow, oddzial.zolnierze}; nowy_oddzial.zolnierze.push_back(z); nowe_oddzialy.push_back(nowy_oddzial); } } std::cout << min_zgrzytow << ' ' << najlepszych_oddzialow << std::endl; oddzialy.clear(); oddzialy.swap(nowe_oddzialy); } } |