列表

详情


NC14893. 栈和排序

描述

给你一个1->n的排列和一个栈,入栈顺序给定
你要在不打乱入栈顺序的情况下,对数组进行从大到小排序
当无法完全排序时,请输出字典序最大的出栈序列

输入描述

第一行一个数n
第二行n个数,表示入栈的顺序,用空格隔开,结尾无空格

输出描述

输出一行n个数表示答案,用空格隔开,结尾无空格

示例1

输入:

5
2 1 5 3 4

输出:

5 4 3 1 2

说明:

2入栈;1入栈;5入栈;5出栈;3入栈;4入栈;4出栈;3出栈;1出栈;2出栈

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 1170ms, 内存消耗: 73288K, 提交时间: 2022-05-29 21:03:15

x=int(input())
a=input("").split()
s=[]
res=[]
vis=[0]*(x+10)
for i in a:
    s.append(i)
    vis[int(i)]=1
    while x and vis[x]:
        x-=1
    while s and x<=int(s[-1]):
        res.append(s[-1])
        s.pop()
while s:
    res.append(s[-1])
    s.pop()
for j in res:
    print(j,end=" ");

C++(clang++ 11.0.1) 解法, 执行用时: 155ms, 内存消耗: 12896K, 提交时间: 2022-09-23 13:06:32

#include<stdio.h>
int n,k,i,a[683913],b[683913],m[683913];
int main(){
	for(scanf("%d",&n),i=0;i<n;++i)scanf("%d",&a[i]);
	for(i=n;i;--i)m[i-1]=m[i]>a[i-1]?m[i]:a[i-1];
	for(;i<n;++i,++k)for(b[k]=a[i];b[k]>m[i+1];--k)printf("%d ",b[k]);
}

pypy3 解法, 执行用时: 821ms, 内存消耗: 108376K, 提交时间: 2023-04-09 15:03:41

n=int(input())
a=list(map(int,input().split()))
b=[0]*(n+1)
st=[]
for i in range(n-1,-1,-1):
    b[i]=max(a[i],b[i+1])
    
for i in range (n):
    st.append(a[i])
    while len(st) and st[-1]>b[i+1]:
        print(st.pop(),end=" ")

上一题