P1155 雙棧排序

2022-08-26 07:48:07 字數 1742 閱讀 9229

tom最近在研究乙個有趣的排序問題。如圖所示,通過2個棧s1和s2,tom希望借助以下4種操作實現將輸入序列公升序排序。

操作a如果輸入序列不為空,將第乙個元素壓入棧s1

操作b如果棧s1不為空,將s1棧頂元素彈出至輸出序列

操作c如果輸入序列不為空,將第乙個元素壓入棧s2​

操作d如果棧s2​不為空,將s2棧頂元素彈出至輸出序列

如果乙個1−n的排列p可以通過一系列操作使得輸出序列為1,2,…,(n−1),tom就稱p是乙個「可雙棧排序排列」。例如(1,3,2,4)就是乙個「可雙棧排序序列」,而(2,3,4,1)不是。下圖描述了乙個將(1,3,2,4)排序的操作序列:

當然,這樣的操作序列有可能有幾個,對於上例(1,3,2,4),是另外乙個可行的操作序列。tom希望知道其中字典序最小的操作序列是什麼。

第一行是乙個整數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

乙個簡單的遞推演算法。

這個題目其實不需要二分圖,也不需要搜尋。

只要思考如果能夠排序,元素需要滿足什麼性質,然後貪心地向a棧新增即可。

orz**

#include#include#include#include#includeusing namespace std;

const int n=1010;

char ans[2*n];

int in[n],a[n],b[n];

int ad,bd,k,n,cnt,asd;

bool check(int k)

int main ()

if(b[bd]==asd)

if(at<=n&&in[at]

if(at<=n&&in[at]

able=0;

break;

} if(able)

for(int i=1; i<=cnt; i++)

putchar(ans[i]),putchar(' ');

else

printf("0");

printf("\n");

return 0;

}

P1155 雙棧排序

tom最近在研究乙個有趣的排序問題。如圖所示,通過2個棧s1和s2,tom希望借助以下4種操作實現將輸入序列公升序排序。操作a如果輸入序列不為空,將第乙個元素壓入棧s1 操作b如果棧s1不為空,將s1棧頂元素彈出至輸出序列 操作c如果輸入序列不為空,將第乙個元素壓入棧s2 操作d如果棧s2不為空,將...

P1155 雙棧排序

tom最近在研究乙個有趣的排序問題。如圖所示,通過2個棧s1 和s2 tom希望借助以下4種操作實現將輸入序列公升序排序。操作a如果輸入序列不為空,將第乙個元素壓入棧s1 操作b如果棧s1 不為空,將s1 棧頂元素彈出至輸出序列 操作c如果輸入序列不為空,將第乙個元素壓入棧s2 操作d如果棧s2 不...

P1155 雙棧排序

miku 規律 假如只有乙個棧,那麼如果原序列存在三個數x v y v x v z 那麼就不可能排序成功,但是這裡有兩個棧,那麼就應該把原序列分成兩部分 兩部分?二分圖。把不能在一起的點連邊,進行二分圖染色。如果成功,就意味著存在 兩個棧的成員搞定了 反之不存在 include include in...