T4312 最大出栈顺序

题目描述

给你一个栈和n个数,按照n个数的顺序入栈,你可以选择在任何时候将数

出栈,使得出栈的序列的字典序最大。

输入输出格式

输入格式:

输入共2行。

第一行个整数n,表示入栈序列长度。

第二行包含n个整数,表示入栈序列。

输出格式:

仅一行,共n个整数,表示你计算出的出栈序列。

输入输出样例

输入样例#1:
3
2 1 3
输出样例#1:
3 1 2

说明

对于100%的数据, 1 ≤ n≤ 10 6 , 所有读入的数字互不重复即一定是个排列。

 

 1 #include <cstdio>
 2 #include <stack>
 3 using namespace std;
 4 int const MAX = 1e6 + 2;
 5 int cur[MAX], pos[MAX], num[MAX];
 6 stack <int> s;
 7 int main()
 8 {
 9     int n;
10     scanf("%d",&n);
11     for(int i=0;i<n;i++)
12         scanf("%d", &num[i]);
13     for(int i=n;i>0;i--) 
14     {
15         if(cur[i] > num[i - 1])
16         {
17             cur[i - 1] = cur[i];
18             pos[i - 1] = pos[i];
19         }
20         else
21         {
22             cur[i - 1] = num[i - 1];
23             pos[i - 1] = i - 1;
24         }
25     }
26     for(int j = 0, i = 0; i < n; i++)
27     {
28         if(s.empty() || s.top() < cur[j])
29         {
30             for(int k = pos[j]; j <= k; j++)
31                 s.push(num[j]);
32         }
33         if(i != n - 1)
34         {
35             printf("%d ", s.top());
36             s.pop();
37         }
38         else
39             printf("%d\n", s.top());
40     }
41 }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值