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】輸出樣例#1:41 3 2 4
【輸入樣例2】
42 3 4 1
【輸入樣例3】
32 3 1
【輸出樣例1】30%的資料滿足: n<=10a b a a b b a b
【輸出樣例2】
0【輸出樣例3】
a c a b b d
50%的資料滿足: n<=50
100%的資料滿足: n<=1000
如果滿足 inum[k]就不能單棧排序並考慮雙棧
如果 不是二分圖 就不能雙棧排序
最後模擬輸出 ————我居然在模擬上卡了很長時間!!
1 #include 2 #include 3 #include 4 #include 56using
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不為空,將...