题目大意:小 R 有 n 和一个 1~n
的排列,想求它的下一个排列(下一个排列的定义是:1~n
的所有全排列按字典序排好后,排在 A 后面的那个叫做 A
的下一个排列。字典序中最后一个排列的下一个排列认为是字典序中第一个排列)。
一眼题,从后往前找到第一个递减的,然后从这个递减的下标开始到结束找第一个大于it的
前边的不用管,直接输出就可以
代码如下:
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
| #include <bits/stdc++.h> #define ll long long using namespace std;
const int N = 1e5 + 66;
int n, top, tag; set<int>s; int a[N], sta[N];
signed main() { int i; n = read(); for (i = 1; i <= n; ++ i) a[i] = read(); sta[++ top] = a[n], s.insert(a[n]); for (i = n - 1; i >= 1; -- i) { s.insert(a[i]); if (a[i] > sta[top]) sta[++ top] = a[i]; else {tag = i; break;} }
for (i = 1; i < tag; ++ i) put(a[i]); for (set<int>::iterator it = s.begin(); it != s.end(); ++ it) if (*it > a[tag]) {put(*it), s.erase(it); break;}
for (set<int>::iterator it = s.begin(); it != s.end(); ++ it) put(*it); puts("");
fclose(stdin), fclose(stdout); return 0; }
|