2020/3/22《移动圆盘 》解题报告

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;
}
posted @ 2020-03-22 16:19  刘凌斌  阅读(244)  评论(0编辑  收藏  举报