洛谷 P1155 雙棧排序

2022-04-10 15:51:43 字數 2184 閱讀 9338

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希望知道其中字典序最小的操作序列是什麼。

輸入格式:

輸入檔案twostack.in的第一行是乙個整數n。

第二行有n個用空格隔開的正整數,構成乙個1~n的排列。

輸出格式:

輸出檔案twostack.out共一行,如果輸入的排列不是「可雙棧排序排列」,輸出數字0;否則輸出字典序最小的操作序列,每兩個操作之間用空格隔開,行尾沒有空格。

輸入樣例#1:

【輸入樣例1】

41 3 2 4

【輸入樣例2】

42 3 4 1

【輸入樣例3】

32 3 1

輸出樣例#1:

【輸出樣例1】

a b a a b b a b

【輸出樣例2】

0【輸出樣例3】

a c a b b d

30%的資料滿足: n<=10

50%的資料滿足: n<=50

100%的資料滿足: n<=1000

如果滿足 inum[k]就不能單棧排序並考慮雙棧

如果 不是二分圖 就不能雙棧排序

最後模擬輸出  ————我居然在模擬上卡了很長時間!!

1 #include 2 #include 3 #include 4 #include 5

6using

namespace

std;78

const

int n(1000+15);9

intn,num[n],pre,mi[n];

1011

inthead[n],sumedge;

12struct

edge

1317 }edge[n<<1

];18

void ins(int u,int

v)19

2324

intcol[n],st1[n],st2[n],to1,to2;

25void paint_(int

s)2643}

44else

4549}50

}51}52

53int

main()

54

78else

if(!to1||st1[to1]>num[i])

79 st1[++to1]=num[i],printf("a "

);80

for(;to1&&st1[to1]==now_min;)

81 printf("

b "),to1--,now_min++;82}

83else

8490

else

if(!to2||st2[to2]>num[i])

91 st2[++to2]=num[i],printf("c "

);92

for(;to2&&st2[to2]==now_min;)

93 printf("

d "),to2--,now_min++; 94}

95}96for(;now_min<=n;now_min++)

97101

return0;

102 }

洛谷P1155 雙棧排序

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

洛谷P1155 雙棧排序 貪心

題目鏈結 首先不難想到一種貪心策略 能彈則彈,優先放a 然後xjb寫了寫發現只有 40 原因是存在需要決策的情況 比如 a b 現在進來乙個 7 看上去很難判斷 7 到底放在 如果放 a 後面來個 9 再來個 6 我們就涼了。但是如果先來的是 6 且此時已經排完了 1 5 那麼我們可以在後續操作中把...

P1155 雙棧排序

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