P1750 出栈序列

题目描述
给定一个由n个元素构成的序列,你需要将其中的元素按顺序压入一个大小为c的栈并弹出。元素按它们的出栈顺序进行排列,会得到一个新的序列。我们知道,这样的序列会有很多种,请输出所有新序列中第一个元素最小的序列(若第一个元素最小的序列有多个,则令第二个尽可能小;若仍有多个,则令第三个最小,以此类推)。

输入格式
第一行,两个数n,c

第二行n个数,为序列中n个元素的值

输出格式
输出n个数,为满足要求的序列。

输入输出样例
输入 #1 复制
6 3
5 2 3 8 7 4
输出 #1 复制
2 3 5 4 7 8
说明/提示
对于40%的数据,n<=12

对于100%的数据,c<=n<=10000,元素大小均在2*10^9以内。

用栈模拟 栈栈栈

#include<bits/stdc++.h> 
using namespace std;
#define N 10005
stack<long long>s;
long long a[N];
int main(){
	int n, c, tmp, loc = 1, w = 2;
	cin >> n >> c;
	for(int i=1; i<=n; i++)
		cin >> a[i];
	s.push(a[1]);
	while(loc <= n){//原序列 
		int x = w; //x:待入栈的第一个元素  
		if(s.empty()){//确保栈内有一个元素
			s.push(a[x]);
			x++;
		}
		int lens = s.size(), minp;//lens:栈的长度 minp:栈内最小元素的下标 
		int len = c - lens;//len:可入栈的元素个数 
		int tmp = s.top();//tmp:参考元素 
		for(int i=x; i<=x+len-1 && i<=n; i++){//在可入栈范围内找到最小值 
			if(a[i] < tmp){
				minp = i;
				tmp = a[i];
			}
		}
		if(tmp != s.top()){//若最小值不是栈顶元素(其实栈内就也一个数) 
			for(int i=x; i<=minp; i++)//把最小元素前面的元素都入栈 
				s.push(a[i]);
			w = minp+1;//w:待入栈的第一个元素  
		}
		else{//栈顶就是c长度内的最小值 
			w = x;//x就是待入栈的第一个元素
		}
		loc++;//累计出去的数 
		cout << s.top() << " ";
		s.pop();
	}
	while(!s.empty()){
		cout << s.top() << " ";
		s.pop();
	}
	return 0;	
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值