ACGO首个AC的GO
2024-04-14 14:48:00
发布于:上海
66阅读
0回复
0点赞
#include<iostream>
using namespace std;
int s[100005],r=0;//stack
void push(int x){s[r++] = x;}
void pop(){r--;}
int top(){return s[r-1];}
bool empty(){return !r;}
int b[100005],l=0,ri=0;//queue,为了防止TLE
void push1(int x){b[ri++]=x;}
int fount1(){return b[l];}
void pop1(){l++;}
int size1(){return ri-l;}
int main(){//题目写是1~n的数字,也就是说不会有重复数字且都小于等于n,可以用它为突破口
int n,a;
cin >> n;
int f=1;
for (int i = 0 ; i < n ; i++){
cin >> a;
if (a==n)f=0;
else if (f)push(a);//用栈储存已进栈的
else if (a!=n){push1(a);}//用队列储存未进栈的
}//用n为分界线(因为n一定为首,不管怎样都能取到它)
cout<<n<<" ";
int idx2,ff;
for (int i=n-1;i>0;i--){//要求字典序最大,所以从大到小查找
ff=0;
for (int j=l;j<ri;j++){//通过队列查找对应的值(这样可以最大程度上减少时间,防止TLE)
if(b[j]==i){
ff=1;//ff用来判断有没有找到
idx2=j;
cout<<i<<" ";
break;
}
}
if (ff){//如果找到,那么把找到数字之前的数字都存进栈里
for (int i=l;i<idx2;i++){
push(fount1());
pop1();
}
pop1();//这里再pop是要把找到的数字删去
}
ff=0;
while (top()>=i&&!empty()){//如果栈首大于或等于查找数字,那么也让它出栈
ff=1;
cout<<top()<<" ";
pop();//出栈
if (top()==i)i--;//如果栈首等于查找数字,则无需再查一遍(就是省时间(^-^))
}
}//最后栈和队列肯定为空,所以无需遍历
return 0;
}
看在这么详细的题解上,点个赞不过分吧
全部评论 1
点个赞不过分。
2024-05-25 来自 上海
16
2024-06-04 来自 广东
1
有帮助,赞一个