zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    获取请求IP
    Excel导入工具类兼容xls和xlsx
    Openshift 4.3环境的离线Operatorhub安装
    RHEL学习
    OpenShift Service Mesh 培训作业
    OpenId Connect认证配置
    Route Sharding in OpenShift 4.3
    OpenShift 4.3环境中创建基于Go的Operator
    Quay和Clair的集成
    Quay 基础版安装和部署
  • 原文地址:https://www.cnblogs.com/CNLLB/p/12546681.html
Copyright © 2011-2022 走看看