#include <vector> #include <iterator> #include <iostream> #include <algorithm> #include <limits.h> #include <sstream> using namespace std; int main() { int n; cin >> n; vector<int> v(n, 100), vmax(n, 100); int t[30001], r[30001], rmax[30001]; for (int i = 0; i < n; i++) { cin >> t[i]; v[i] = i; } // for (vector<int>::iterator it=v.begin(); it<v.end(); it++) // std::cout << ' ' << *it; // std::cout << '\n'; bool w = true; int iter = 0; int kmax = 0; stringstream ss; do { kmax = 0; do { w = true; int i = 0; for (vector<int>::reverse_iterator it = v.rbegin(); it < v.rend(); it++) { // std::cout << ' ' << t[*it]; r[i] = t[*it]; i++; } // for (vector<int>::reverse_iterator it = v.rbegin(); it < v.rend(); // it++) { // std::cout << ' ' << (*it) + 1; // } int smin = 0; int k = 0; for (vector<int>::reverse_iterator it = v.rbegin(); it < v.rend(); it++) { // std::cout << ' ' << r[(n - 1 - *it)]; if (r[(n - 1 - *it)] > smin) { smin = r[(n - 1 - *it)]; k++; if (kmax < k) { kmax = k; std::copy(std::begin(r), std::end(r), std::begin(rmax)); vmax.clear(); copy(v.begin(), v.end(), back_inserter(vmax)); } } else { w = false; break; } } // std::cout << " wynik:" << w << " k:" << k << "\n"; // if (w) { // // for (vector<int>::reverse_iterator it = v.rbegin(); // it < v.rend(); it++) { // std::cout << ' ' << r[*it]; // } // // for (vector<int>::reverse_iterator it = v.rbegin(); // it < v.rend(); it++) { // std::cout << ' ' << (*it) + 1; // } // std::cout << '\n'; // } } while (!w && next_permutation(v.begin(), v.end())); iter++; ss << kmax << "\n"; int i = 0; for (vector<int>::reverse_iterator it = vmax.rbegin(); it < vmax.rend(); it++) { ss << "" << ((*it) + 1) << " "; i++; if(i >= kmax) break; } ss << '\n'; if (kmax < n) { std::copy(std::begin(rmax), std::end(rmax), std::begin(t)); // for (int i = 0; i < n; i++) { // ss << " " << t[i]; // } // ss<< '\n'; } } while (kmax < n); cout << iter << "\n"; cout << ss.str(); 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 101 102 103 104 105 106 107 108 | #include <vector> #include <iterator> #include <iostream> #include <algorithm> #include <limits.h> #include <sstream> using namespace std; int main() { int n; cin >> n; vector<int> v(n, 100), vmax(n, 100); int t[30001], r[30001], rmax[30001]; for (int i = 0; i < n; i++) { cin >> t[i]; v[i] = i; } // for (vector<int>::iterator it=v.begin(); it<v.end(); it++) // std::cout << ' ' << *it; // std::cout << '\n'; bool w = true; int iter = 0; int kmax = 0; stringstream ss; do { kmax = 0; do { w = true; int i = 0; for (vector<int>::reverse_iterator it = v.rbegin(); it < v.rend(); it++) { // std::cout << ' ' << t[*it]; r[i] = t[*it]; i++; } // for (vector<int>::reverse_iterator it = v.rbegin(); it < v.rend(); // it++) { // std::cout << ' ' << (*it) + 1; // } int smin = 0; int k = 0; for (vector<int>::reverse_iterator it = v.rbegin(); it < v.rend(); it++) { // std::cout << ' ' << r[(n - 1 - *it)]; if (r[(n - 1 - *it)] > smin) { smin = r[(n - 1 - *it)]; k++; if (kmax < k) { kmax = k; std::copy(std::begin(r), std::end(r), std::begin(rmax)); vmax.clear(); copy(v.begin(), v.end(), back_inserter(vmax)); } } else { w = false; break; } } // std::cout << " wynik:" << w << " k:" << k << "\n"; // if (w) { // // for (vector<int>::reverse_iterator it = v.rbegin(); // it < v.rend(); it++) { // std::cout << ' ' << r[*it]; // } // // for (vector<int>::reverse_iterator it = v.rbegin(); // it < v.rend(); it++) { // std::cout << ' ' << (*it) + 1; // } // std::cout << '\n'; // } } while (!w && next_permutation(v.begin(), v.end())); iter++; ss << kmax << "\n"; int i = 0; for (vector<int>::reverse_iterator it = vmax.rbegin(); it < vmax.rend(); it++) { ss << "" << ((*it) + 1) << " "; i++; if(i >= kmax) break; } ss << '\n'; if (kmax < n) { std::copy(std::begin(rmax), std::end(rmax), std::begin(t)); // for (int i = 0; i < n; i++) { // ss << " " << t[i]; // } // ss<< '\n'; } } while (kmax < n); cout << iter << "\n"; cout << ss.str(); return 0; } |