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