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 }
AC代码

 

posted @ 2018-05-16 13:52  garage  阅读(87)  评论(0编辑  收藏  举报