我们有一个由n个元素构成的序列,需要按顺序将其中的元素压入一个大小为c的栈,你可以在任意时候把栈内的元素弹出(如果有的话),按它们的出栈顺序排列下来,会得到一个新的序列。因为这样的序列会有很多种,所以我们需要找到所有新序列中字典序最小的那个。(保证c<=n<=10000,元素大小均在2*10^9以内。)
我们可以设定两根指针L和R来模拟栈,L一开始为1,R一开始为c。每次从L到R找到没被选中过的数中最小的一个打出,并设其为已选中。移动L和R,反复操作直至所有数都被打出。时间复杂度为o(n^2)。
#include<bits/stdc++.h> using namespace std; const int N = 1e4 + 7; int a[N]; bool vis[N]; int main() { int n, c; cin>>n>>c; for(int i = 1; i <= n; i++) cin>>a[i]; int L = 1, R = c, pt = 0;//L, R是左右指针,pt是已经输出了几个数 int id = L; int Min = 2e9 + 7; while(pt < n){ for(int i = L; i <= R; i++){ if(__(1)__){ __(2)__ Min = a[i]; } } cout<<Min<<" "; vis[id] = 1; pt++; for(L = __(3)__; L > 1; L--){ if(!vis[L]) break; } R = __(4)__; Min = __(5)__; } }