题目链接:点击打开链接
模拟栈排序
题意即给出一个n和k个前缀,如果可以完成栈排序则补全这n个数使其字典序最大,否则输出-1
思路即首先判断k个前缀是否满足栈排序,如果满足则进行补全
补全时按递减序列进行即可
AC代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <stack>
using namespace std;
int num[200005];
int n, k;
stack<int> st;
int main()
{
while(cin>>n>>k)
{
while(!st.empty()) st.pop();
int cur = 1, flag = 1, maxn = -1;
for(int i=1;i<=k;++i)
{
cin>>num[i];
maxn = max(num[i],maxn);
if(st.empty() || st.top()>num[i]) st.push(num[i]);
else
{
while(!st.empty() && st.top()<num[i])
if(st.top() == cur) st.pop(), cur++;
else
{
flag = 0;
break;
}
if(flag == 0)
{
for(int j=i+1;j<=k;++j)
cin>>num[j];
break;
}
st.push(num[i]);
}
}
if(flag)
{
while(!st.empty())
{
int temp = st.top();
if(temp > cur)
{
for(int i=temp-1;i>cur;--i)
num[++k] = i;
num[++k] = cur;
cur = temp;
}
if(st.top()==cur) st.pop(), cur++;
}
for(int i=n;i>=maxn;--i)
num[++k] = i;
for(int i=1;i<n;++i)
cout<<num[i]<<" ";
cout<<num[n]<<endl;
}
else cout<<-1<<endl;
}
return 0;
}