2020/3/22
《移动圆盘 》解题报告
题目
给出n个圆盘的半径,现在要把这些圆盘依次放在柱子上,当准备把第i个半径为ai的圆盘放置到柱子上时,如果柱子顶部的圆盘半径小于ai,那么将柱子顶部的圆盘拿出,如果顶部的盘子半径仍然小于ai,那么继续拿出,直到顶部圆盘半径大于或等于ai为止,此时才把第i个盘子放到柱子上。那么,最后从下往上输出柱子上的圆盘半径依次是什么?
输入格式
第一行包含一个整数n(n<=100000),表示有n个圆盘要依次放到柱子上。 接下来n行,每行一个整数,表示第i个圆盘的半径ai (ai<=100000)。
输出格式
输出多行,表示最后柱子上中的圆盘半径。
输入样例
5
5
3
2
4
1
输出样例
5
4
1
解题思路1:
按照题意进行暴力模拟,答案很打击人,会超时!!!
#include <iostream>
#include <cstdio>
using namespace std;
int pan[100005];
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)cin >> pan[i];
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
if (pan[i] > pan[j])pan[j] = -1;
}
}
for (int i = 0; i < n; i++) {
if (pan[i] != -1) {
cout << pan[i] << endl;
}
}
return 0;
}
解题思路2:
使用栈和队列的知识,时间复杂度明显降低。(c++的特色)
输入前使用“stack<变量类型>变量名”进行调用
- push(): 向栈内压入一个成员;
- pop(): 从栈顶弹出一个成员;
- empty(): 如果栈为空返回true,否则返回false;
- top(): 返回栈顶,但不删除成员;
- size(): 返回栈内元素的大小;
#include<bits/stdc++.h>
using namespace std;
stack<int>s,t;
int main(){
int n;
cin>>n;
int a;
cin>>a;
s.push(a);
for(int i=1;i<n;i++){
cin>>a;
while(s.size()>=1&&s.top()<a){
s.pop();
}
s.push(a);
}
while(!s.empty()){
t.push(s.top());
s.pop();
}
while(!t.empty()){
cout<<t.top()<<endl;
t.pop();
}
return 0;
}