b804 雙棧排序

2021-09-28 10:01:00 字數 3087 閱讀 6608

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,...