题目描述
给定一个由n个元素构成的序列,你需要将其中的元素按顺序压入一个大小为c的栈并弹出。元素按它们的出栈顺序进行排列,会得到一个新的序列。我们知道,这样的序列会有很多种,请输出所有新序列中第一个元素最小的序列(若第一个元素最小的序列有多个,则令第二个尽可能小;若仍有多个,则令第三个最小,以此类推)。
输入输出格式
输入格式:
第一行,两个数n,c
第二行n个数,为序列中n个元素的值
输出格式:
输出n个数,为满足要求的序列。
输入输出样例
输入样例#1:
复制
6 3 5 2 3 8 7 4
输出样例#1:
复制
View Code
2 3 5 4 7 8
显然单调队列是错的
如 4 3
1 3 4 2
- 此题思路其实很简单,所谓的贪心其实就是模拟,模拟一个滑动窗口
![](https://i-blog.csdnimg.cn/blog_migrate/a3d606905e8e025db5893f15832e9e42.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<bits/stdc++.h> using namespace std; long long a[10005]; bool used[10005]; int main() { long long n,c,i,j; scanf("%lld%lld",&n,&c); for(i=1;i<=n;i++) { scanf("%lld",&a[i]); } long long l=1,r=c,k=n,minn,mi; while(k!=0) { minn=9999999999; for(i=l;i<=r;i++) { if(a[i]<minn&&used[i]==0) { minn=a[i]; mi=i; } } if(k==0) printf("%lld\n",minn); else printf("%lld ",minn); k--; used[mi]=1; long long z=0; for(j=mi-1;j>=1;j--) { if(used[j]==0) { l=j; z=1; break; } } if(r<n) r++; if(z==0) l++; } return 0; }