題目鏈結
首先不難想到一種貪心策略:能彈則彈,優先放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不為空,將...