time limit: 1 second
memory limit: 50 mb
【問題描述】
tom最近在研究乙個有趣的排序問題。如圖所示,通過2個棧s1和s2,tom希望借助以下4種操作實現將輸入序列公升序排序。
操作a如果輸入序列不為空,將第乙個元素壓入棧s1
操作b如果棧s1不為空,將s1棧頂元素彈出至輸出序列
操作c如果輸入序列不為空,將第乙個元素壓入棧s2
操作d如果棧s2不為空,將s2棧頂元素彈出至輸出序列
如果乙個1~n的排列p可以通過一系列操作使得輸出序列為1,2,…,(n-1),n,tom就稱p是乙個「可雙棧排序排列」。例如(1,3,2,4)就是乙個「可雙棧排序序列」,而(2,3,4,1)不是。下圖描述了乙個將(1,3,2,4)排序的操作序列:
當然,這樣的操作序列有可能有幾個,對於上例(1,3,2,4),是另外乙個可行的操作序列。tom希望知道其中字典序最小的操作序列是什麼。
【輸入】
共2行。第一行是乙個整數n。
第二行有n個用空格隔開的正整數,構成乙個1~n的排列。
【輸出】
共一行,如果輸入的排列不是「可雙棧排序排列」,輸出數字0;否則輸出字典序最小的操作序列,每兩個操作之間用空格隔開,行尾沒有空格。
【輸入樣例1】
4
1 3 2 4
【輸出樣例1】
a b a a b b a b
【輸入樣例2】
4
2 3 4 1
【輸出樣例2】
0
【輸入樣例3】
3
2 3 1
【輸出樣例3】
a c a b b d
【 限制】
30%的資料滿足: n<=10
50%的資料滿足: n<=50
100%的資料滿足: n<=1000
【題目鏈結】:
【題意】
給你兩個棧;
讓你利用這兩個棧,將所給無序排列順序輸出;
【題解】
什麼時候要用到兩個棧呢?
可以用1 2 3來理解;
1 2 3則只要乙個棧就夠了,每次進去之後直接輸出
1 3 2第乙個進去直接出來,第2個,第3個都壓進同乙個棧裡面,然後按照棧規則順序彈出
2 1 3第乙個和第二個都壓進去然後順序彈出,然後再把3壓進去再彈出
2 3 1可以嘗試一下,怎麼搞都沒辦法用乙個棧實現;
3 1 2和3 2 1都能用乙個棧搞;
所以只有
2 3 1這種情況不能用乙個棧搞;
但是如果2和3放在兩個棧裡面就能搞了;
根據這個規則即
如果i< j< k
且存在a[k]< a[i]< a[j];
則i和j要放在不同棧裡面;
其他情況都能用乙個棧搞定;
寫個二分圖染色;
如果可以染色就表示可以;
不能染色直接輸出0;
優先把數字染色為1,其次染色為2;
然後對於顏色為1的,進第乙個棧,顏色為2的進第二個棧;
每次看看該進相應棧的棧頂元素是不是比當前元素大,如果是就進棧;
否則出棧就好;
模擬一下就好;
【完整**】
#include
#include
#include
#include
#include
using
namespace
std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ll long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%i64d",&x)
typedef pair pii;
typedef pairpll;
const
int dx[9] = ;
const
int dy[9] = ;
const
double pi = acos(-1.0);
const
int maxn = 1e3+100;
struct abc
;abc bian[maxn*maxn*2];
int n,a[maxn],mi[maxn],tot,fir[maxn],col[maxn];
string ans = "";
stack
sta[3];
void add(int x,int y)
void dfs(int x,int c)
else
return;
for (int i = fir[x];i;i = bian[i].nex)
dfs(bian[i].en,3-c);
}int main()
if (!sta[1].empty() && sta[1].top()==sc)
if (col[sr] == 2 && (sta[2].empty()||sta[2].top()>a[sr]))
if (!sta[2].empty() && sta[2].top()==sc)
}int len = ans.size();
rep1(i,0,len-1)
return
0;}
1002 雙棧排序
description tom最近在研究乙個有趣的排序問題。如圖所示,通過2個棧s1和s2,tom希望借助以下4種操作實現將輸入序列公升序排序。操作a 如果輸入序列不為空,將第乙個元素壓入棧s1 操作b 如果棧s1不為空,將s1棧頂元素彈出至輸出序列 操作c 如果輸入序列不為空,將第乙個元素壓入棧s...
雙棧排序練習
題目 請編寫乙個程式,按公升序對棧進行排序 即最大元素位於棧頂 要求最多只能使用乙個額外的棧存放臨時資料,但不得將元素複製到別的資料結構中。給定乙個int numbers c 中為vector 其中第乙個元素為棧頂,請返回排序後的棧。請注意這是乙個棧,意味著排序過程中你只能訪問到第乙個元素。解題思路...
nowcoder 雙棧排序
請編寫乙個程式,按公升序對棧進行排序 即最大元素位於棧頂 要求最多只能使用乙個額外的棧存放臨時資料,但不得將元素複製到別的資料結構中。給定乙個int numbers c 中為vector 其中第乙個元素為棧頂,請返回排序後的棧。請注意這是乙個棧,意味著排序過程中你只能訪問到第乙個元素。測試樣例 1,...