tyvj/joyoi 1336 火车进栈
比原题水了很多(因为原题要高精度)
输出字典序前20种出栈序列。
其实是贪心题:我们每次确定一个出栈的数。
当栈里有数时,字典序显然比从后面拿数要小,所以先搜这个。
之后依次搜后面队列里的数,因为字典序依次增大。
有20个答案了就exit(0)。
然后就一遍AC了!!
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 const int N = 30; 5 6 int n, ans; 7 int l[N], r[N], d[N], tl, tr, td; 8 9 void DFS(int k) { 10 if(k == n) { 11 ans++; 12 for(int i = 1; i < n; i++) { 13 printf("%d", l[i]); 14 } 15 printf("%d", td ? d[td] : r[tr]); 16 if(ans == 20) exit(0); 17 printf("\n"); 18 return; 19 } 20 if(td) { 21 l[++tl] = d[td--]; 22 DFS(k + 1); 23 d[++td] = l[tl--]; 24 } 25 if(!tr) return; 26 int temp = tr; 27 l[++tl] = r[tr--]; 28 while(tr) { 29 DFS(k + 1); 30 d[++td] = l[tl]; 31 l[tl] = r[tr--]; 32 } 33 DFS(k + 1); 34 /// 复原 35 tr = temp; 36 tl--; 37 td -= (temp - 1); 38 return; 39 } 40 41 int main() { 42 scanf("%d", &n); 43 for(int i = n; i >= 1; i--) { 44 r[i] = n - i + 1; 45 } 46 tr = n; 47 DFS(1); 48 return 0; 49 }