问题 3754 --序列(完善程序)

3754: 序列(完善程序)★★★

时间限制: 1 Sec  内存限制: 128 MB
提交: 170  解决: 90
[提交][状态][命题人:]

题目描述

我们有一个由n个元素构成的序列,需要按顺序将其中的元素压入一个大小为c的栈,你可以在任意时候把栈内的元素弹出(如果有的话),按它们的出栈顺序排列下来,会得到一个新的序列。因为这样的序列会有很多种,所以我们需要找到所有新序列中字典序最小的那个。(保证c<=n<=10000,元素大小均在2*10^9以内。)

我们可以设定两根指针L和R来模拟栈,L一开始为1,R一开始为c。每次从L到R找到没被选中过的数中最小的一个打出,并设其为已选中。移动L和R,反复操作直至所有数都被打出。时间复杂度为o(n^2)。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 7;
int a[N];
bool vis[N];
int main()
{
	int n, c;
	cin>>n>>c;
	for(int i = 1; i <= n; i++) cin>>a[i];
	int L = 1, R = c, pt = 0;//L, R是左右指针,pt是已经输出了几个数 
	int id = L;
	int Min = 2e9 + 7;
	while(pt < n){
		for(int i = L; i <= R; i++){
			if(__(1)__){
				__(2)__
				Min = a[i];
			}
		}
		cout<<Min<<" ";
		vis[id] = 1;
		pt++;
		for(L = __(3)__; L > 1; L--){
			if(!vis[L])
				break;
		}
		R = __(4)__;
		Min = __(5)__;
	}
}

输入

输出

样例输入
Copy
6 3
5 2 3 8 7 4
样例输出
Copy
2 3 5 4 7 8

提示

来源

[提交][状态]