洛谷P1155 雙棧排序 貪心

2021-09-08 05:24:53 字數 1118 閱讀 6600

題目鏈結

首先不難想到一種貪心策略:能彈則彈,優先放a

然後xjb寫了寫發現只有\(40\),原因是存在需要決策的情況

比如\(a = \)

\(b = \)

現在進來乙個\(7\),看上去很難判斷\(7\)到底放在**,如果放\(a\),後面來個\(9\),再來個\(6\),我們就涼了。

但是如果先來的是\(6\),且此時已經排完了\(1-5\),那麼我們可以在後續操作中把\(7\)弄走

仔細想想不難發現,\(7\)不能放在\(a\)中,當且僅當存在乙個位置\(k\),滿足\(a[k]>7\),且在\(k\)之後有位置\(l\),滿足\(a[l]<7\)

也就是說\(i, j, k\)不能同時在棧中,當且僅當

\(i < j < k\)且\(a[k] < a[i] < a[j]\)

然後就做完了,xjb貪即可

// luogu-judger-enable-o2

#include#define no

#define pb(x) push_back(x)

using namespace std;

const int maxn = 1001;

inline int read()

while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();

return x * f;

}int n, a[maxn], s1[maxn], tp1, s2[maxn], tp2;

vectorv;

bool check(int pos)

int main()

while(now == s1[tp1] || now == s2[tp2])

if(i == n + 1) break;

if(check(i))

if(!tp2 || a[i] < s2[tp2])

no;}

if(tp1 || tp2) no;

for(int i = 0; i < v.size(); i++) putchar(v[i]), putchar(' ');

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 雙棧排序

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