#include <iostream> #include <vector> #include <algorithm> struct absolwent { int Wzrost; int Ranga; int OstatniaZamiana; }; struct zamiana { int Pierwszy; int Drugi; }; struct runda { std::vector<zamiana> Zamiany; }; struct wynik { std::vector<runda> Rundy; }; const int MAX_N = 3000; int N; absolwent Absolwenci[MAX_N + 1]; int Indeksy[MAX_N + 1]; bool PorownajWzrost(int i, int j) { return Absolwenci[i].Wzrost < Absolwenci[j].Wzrost; } int main() { std::cin >> N; for (int i = 1; i <= N; i++) { std::cin >> Absolwenci[i].Wzrost; } for (int i = 1; i <= N; i++) { Indeksy[i] = i; } std::sort(&Indeksy[1], &Indeksy[N+1], PorownajWzrost); for (int i = 1; i <= N; i++) { Absolwenci[Indeksy[i]].Ranga = i; } wynik Wynik; int NrRundy = 0; for (;;) { NrRundy++; runda Runda; for (int i = 1; i < N; i++) { auto Cel = Absolwenci[i].Ranga; if (Cel == i) { continue; } if (Absolwenci[i].OstatniaZamiana == NrRundy || Absolwenci[Cel].OstatniaZamiana == NrRundy) { continue; } zamiana Z; Z.Pierwszy = i; Z.Drugi = Cel; Absolwenci[i].OstatniaZamiana = NrRundy; Absolwenci[Cel].OstatniaZamiana = NrRundy; std::swap(Absolwenci[i], Absolwenci[Cel]); Runda.Zamiany.push_back(Z); } if (Runda.Zamiany.empty()) break; Wynik.Rundy.push_back(Runda); } std::cout << Wynik.Rundy.size() << '\n'; for (auto Runda : Wynik.Rundy) { std::cout << 2 * Runda.Zamiany.size() << '\n'; for (unsigned i = 0; i < Runda.Zamiany.size(); i++) { if (i != 0) std::cout << ' '; std::cout << Runda.Zamiany[i].Pierwszy; } for (int i = Runda.Zamiany.size() - 1; i >= 0; i--) { std::cout << ' '; std::cout << Runda.Zamiany[i].Drugi; } std::cout << '\n'; } 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 97 98 99 100 | #include <iostream> #include <vector> #include <algorithm> struct absolwent { int Wzrost; int Ranga; int OstatniaZamiana; }; struct zamiana { int Pierwszy; int Drugi; }; struct runda { std::vector<zamiana> Zamiany; }; struct wynik { std::vector<runda> Rundy; }; const int MAX_N = 3000; int N; absolwent Absolwenci[MAX_N + 1]; int Indeksy[MAX_N + 1]; bool PorownajWzrost(int i, int j) { return Absolwenci[i].Wzrost < Absolwenci[j].Wzrost; } int main() { std::cin >> N; for (int i = 1; i <= N; i++) { std::cin >> Absolwenci[i].Wzrost; } for (int i = 1; i <= N; i++) { Indeksy[i] = i; } std::sort(&Indeksy[1], &Indeksy[N+1], PorownajWzrost); for (int i = 1; i <= N; i++) { Absolwenci[Indeksy[i]].Ranga = i; } wynik Wynik; int NrRundy = 0; for (;;) { NrRundy++; runda Runda; for (int i = 1; i < N; i++) { auto Cel = Absolwenci[i].Ranga; if (Cel == i) { continue; } if (Absolwenci[i].OstatniaZamiana == NrRundy || Absolwenci[Cel].OstatniaZamiana == NrRundy) { continue; } zamiana Z; Z.Pierwszy = i; Z.Drugi = Cel; Absolwenci[i].OstatniaZamiana = NrRundy; Absolwenci[Cel].OstatniaZamiana = NrRundy; std::swap(Absolwenci[i], Absolwenci[Cel]); Runda.Zamiany.push_back(Z); } if (Runda.Zamiany.empty()) break; Wynik.Rundy.push_back(Runda); } std::cout << Wynik.Rundy.size() << '\n'; for (auto Runda : Wynik.Rundy) { std::cout << 2 * Runda.Zamiany.size() << '\n'; for (unsigned i = 0; i < Runda.Zamiany.size(); i++) { if (i != 0) std::cout << ' '; std::cout << Runda.Zamiany[i].Pierwszy; } for (int i = Runda.Zamiany.size() - 1; i >= 0; i--) { std::cout << ' '; std::cout << Runda.Zamiany[i].Drugi; } std::cout << '\n'; } return 0; } |