牛客练习赛10 B栈和排序【思维】
2018-01-13 11:43
92 查看
题目描述
给你一个1->n的排列和一个栈,入栈顺序给定你要在不打乱入栈顺序的情况下,对数组进行从大到小排序
当无法完全排序时,请输出字典序最大的出栈序列
输入描述:
第一行一个数n第二行n个数,表示入栈的顺序,用空格隔开,结尾无空格
输出描述:
输出一行n个数表示答案,用空格隔开,结尾无空格示例1
输入
52 1 5 3 4
输出
5 4 3 1 2说明
2入栈;1入栈;5入栈;5出栈;3入栈;4入栈;4出栈;3出栈;1出栈;2出栈备注:
对于100%的数据,有1<=n<=1000000,保证给的是一个排列题意: 略
分析: 我们可以模拟下找到规律,因为输出字典序最大的,第一个输出的肯定是最大的元素,当考虑第i个元素时,如果当前元素是[a[i],n],中最大的元素,那么就输出,否则就入栈,如果输出后,考虑栈顶元素,同上,扫一遍之后如果栈中还有元素,那么就直接输出即可
参考代码
#include<bits/stdc++.h> using namespace std; stack<int> s; vector<int> res; int a ,pre ; int main(){ ios_base::sync_with_stdio(0); int t = -1; int n;cin>>n; for(int i = 0;i < n;i++) cin>>a[i]; for(int i = n-1;i >= 0;i--) { t = max(t,a[i]); pre[i] = t; } for(int i = 0;i < n;i++) { if(a[i] == pre[i]) { res.push_back(a[i]); while (!s.empty() && s.top() > pre[i+1]) { res.push_back(s.top()); s.pop(); } } else { s.push(a[i]); } } while (!s.empty()) { res.push_back(s.top()); s.pop(); } for(int i = 0;i < res.size();i++) { printf("%d%c",res[i],i == res.size() - 1 ? '\n' : ' '); } return 0; }
如有错误或遗漏,请私聊下UP,thx
相关文章推荐
- 牛客练习赛10 B-栈和排序
- 【牛客练习赛13】 A B C D【康拓展开】 E【DP or 记忆化搜索】 F 【思维】
- 牛客练习赛13_C-幸运数字Ⅲ(思维)
- 牛客练习赛7 B 【排序和优先队列】
- 牛客练习赛10
- 牛客练习赛10
- 牛客练习赛10 E 数列查找 [莫队+分块]
- 牛客练习赛13-D:幸运数字Ⅳ(思维)
- 牛客练习赛13 A B C F【二分+思维】
- 牛客练习赛7 E 题 珂朵莉的数列 【树状数组 + 思维】
- 牛客练习赛13 D 题 幸运数字IV 【康拓逆展开 + 思维】
- 牛客练习赛10
- 数据结构与算法分析(Java语言描述)(10)—— (三向切分)快速排序
- 牛客练习赛9
- 牛客练习赛9
- CF----思维排序+01背包 山东省第八届省赛K题
- 10-7-快速排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版
- 牛客练习赛6 B题 点权和
- 10-排序5 PAT Judge (25分)
- 思维导图软件MindManager实用功能TOP 10(二)