首页 > 其他分享 >数学森林/洛谷P1750 出栈序列

数学森林/洛谷P1750 出栈序列

时间:2024-06-03 21:02:47浏览次数:13  
标签:洛谷 start int P1750 序列 test 出栈 include

原创新思路求解出栈序列问题。

问题描述:

数学家小王经过千辛万苦长途跋涉终于来到了数学森林。无奈森林入口有很多个小矮人镇守。小矮人拿出一套题目让小王抽取一道题目说解出题目方能进入数学森林。题目如下:给定一个大小为c(最多可以同时存储c个元素)的堆栈,输入n个入栈的数,请输出所有出栈序列里第一个元素最小的序列(若第一个元素最小的序列有多个,则令第二个尽可能小;若仍有多个,则令第三个最小,以此类推)。
聪敏的你能不能写一段代码,帮助数学家小王解出这个难题。

本题考察栈的使用。

算法思想:

附在代码注释当中。

代码如下:

#include <iostream>
#include<algorithm>
#include<cmath>
#include<stack> 
#include<queue>

using namespace std;


bool check(int start, int c, stack<int>& test, vector<int>& a) {
    int end = min(start + c - (int)test.size(), (int)a.size());
    for (int i = start; i < end; i++) { // 确保不会超出数组边界
        if (a[i] < test.top()) {
            return true;
        }
    }
    return false;
}

int main(){
	int c,n,x;
	stack<int> test;
	cin>>n>>c;
	vector<int> a(n);
	for(int i=0;i<n;i++){
		cin>>x;
		a[i]=x;
	}
	int first=0;
	for(int i=0;i<n;i++){
		if(test.size()<c){
			test.push(a[i]);//如果栈有位置,则直接入栈 
		}
		else{
			//栈满,说明栈顶元素是栈中最小元素,直接出栈并输出 
			cout<<test.top()<<" ";
			test.pop();
			i--;
			continue;//此时栈已有一个空位置,重新进入循环,继续 
		
		}
		if(i!=n-1){
			if(!test.empty() && test.top()>a[i+1]){
				continue;
			}
			while(!test.empty() && test.top()<a[i+1]){
				if(!check(i+1,c,test,a)){  //检查后方可以入栈元素中是否有比当前栈顶元素更小的 
					cout<<test.top()<<" ";  //如果没有,说明栈顶元素为最小,出栈并输出 
					test.pop();
				}
				else{//如果后方有更小的元素可以入栈,继续判断 
					break;
				}
			}
		}
		else{//当前元素为最后一个入栈的元素 
			while(!test.empty()){
				cout<<test.top()<<" ";
			    test.pop();
			}
		}
		
	}
	
    return 0;
}

标签:洛谷,start,int,P1750,序列,test,出栈,include
From: https://blog.csdn.net/m0_73678381/article/details/138138483

相关文章

  • 洛谷估值
    达成时间基础信用练习情况社区贡献比赛情况获得成就总咕值202406031005441193024420240527100532719302292024052010049282030227202405131004630213022720240506100472321302212024042910045172230214......
  • 洛谷P4017 最大食物链计数
    题目信息题目要求样例输入/输出 算法简介 要知道题目需要用到什么样的算法,首先得捋清楚题目的意思比如这个题目,我们读题后可以获得这样的信息:(1)节点之间构成有向边(2)所有边不会构成环(3)需要求的所有的边没有边权而且一定是从入度为零的节点到出度为零的节点基......
  • 洛谷1803 凌乱的yyy / 线段覆盖 【贪心】
    凌乱的yyy/线段覆盖题目背景快noip了,yyy很紧张!题目描述现在各大oj上有nnn个比赛,每个比赛的开始、结束的时间点是知道的。yyy认为,参加越多的比赛,noip就能......
  • 洛谷1090 合并果子 【贪心】
    [NOIP2004提高组]合并果子/[USACO06NOV]FenceRepairG题目描述在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出......
  • 关于洛谷获得数据怪谈
    免责声明:本文仅用于测试键盘性能,输入内容概不负责。在洛谷有时输入数据仅有几个数字,但是出于某些原因无法获得输入数据,但是手贱非常想要获得,于是尝试一种特殊方法。示例题目:P1014[NOIP1999普及组]Cantor表尝试提交以下代码:#include<iostream>usingnamespacestd;intn......
  • 洛谷 P8725 [蓝桥杯 2020 省 AB3] 画中漂流 的题解
    题目大意传送门思路考虑使用时空复杂度为O(tm)O(tm)......
  • 洛谷 P8614 [蓝桥杯 2014 省 A] 波动数列 的题解
    题目大意求满足和为sss且ti=......
  • 【回溯】洛谷P1135奇怪的电梯
    题目描述呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第 ......
  • 博弈论——洛谷P6560 [SBCOI2020] 时光的流逝
    [SBCOI2020]时光的流逝题目背景时间一分一秒的过着,伴随着雪一同消融在了这个冬天,或许,要是时光能停留在这一刻,该有多好啊。......“这是...我在这个小镇的最后一个冬天了吧。”“嗯,你可不能这辈子都呆在这个小镇吧。外面的世界很大呢,很大很大...”“唔...外面的世界...突然......
  • 洛谷P1087 FBI树
    洛谷P1087递归建立树,根据当前树的类型,选择“F”“B”“I”voidbuild(intdepth,intstart,intend,introot){if(depth>=n+1)return;intcurrent=root;intflag=check(start,end);if(flag==0)t[current].self='B';elseif(flag==......