時間限制:c/c++
1秒,其他語言2秒
空間限制:c/c++
131072k,其他語言262144k
64bit io format:
%lld
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希望知道其中字典序最小的操作序列是什麼。
輸入描述:
第一行是乙個整數n。
第二行有n個用空格隔開的正整數,構成乙個1~n的排列
輸出描述:
共一行,如果輸入的排列不是「可雙棧排序排列」,輸出數字0;否則輸出字典序最小的操作序列,每兩個操作之間用空格隔開,行尾沒有空格。
示例1輸入
複製
413
24
輸出
複製
a b a a b b a b
示例2
輸入複製
423
41
輸出
複製
0
示例3
輸入複製
323
1
輸出
複製
a c a b b d
備註:
30
%的資料滿足:n<=
1050
%的資料滿足:n<=
50100
%的資料滿足:n<=
1000
有四種操作,問如何操作可以實現將輸入序列公升序排序
四種操作分別是:
操作a:如果輸入序列不為空,將第乙個元素壓入棧s1
操作b:如果棧s1不為空,將s1棧頂元素彈出至輸出序列
操作c:如果輸入序列不為空,將第乙個元素壓入棧s2
操作d:如果棧s2不為空,將s2棧頂元素彈出至輸出序列
貌似二分圖可以做(不過我還沒看懂)
首先推出規律:
如果兩個數 i,j(i≤j)i,j(i≤j) 不能被放入同乙個棧中,當且僅當存在 k,k>jk,k>j, 且 q[k]現在有兩個棧,我們只需要將滿足這個條件的點各自歸到一邊,中間連一條線,用經典的染色法判斷是否為二分圖,若是則按照顏色入棧,若不是則說明不能完成
#include
#include
#include
#include
#include
#include
#define maxn 1004
using
namespace std;
const
int inf=
19260817
;int n,num;
int color[maxn]
;int t[maxn]
;//要排序的元素的儲存
int s[maxn]
;//判斷兩個數字是否滿足規則
bool flag,e[maxn]
[maxn]
;void
paint
(int x,
int c)}}
void
make()
for(
int i=
1;i}for
(int i=
1;i<=n;i++)}
}void
work()
stack<
int> stack1,stack2;
int now=1;
for(
int i=
1;i<=n;i++
)else
while((
!stack1.
empty()
&& stack1.
top(
)==now)||(
!stack2.
empty()
&& stack2.
top(
)==now)
)else}}
}int
main()
make()
;work()
;return0;
}
每日一題 4月7日題目精講 樹
樹 時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k 其他語言262144k 64bit io format lld 題目描述 shy有一顆樹,樹有n個結點。有k種不同顏色的染料給樹染色。乙個染色方案是合法的,當且僅當對於所有相同顏色的點對 x,y x到y的路徑上的所有點的顏色...
每日一題 4月8日題目精講 黑白樹
試題鏈結 時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 題目描述 一棵n個點的有根樹,1號點為根,相鄰的兩個節點之間的距離為1。樹上每個節點i對應乙個值k i 每個點都有乙個顏色,初始的時候所有點都是白色的。你需要...
每日一題 7月1日題目精講 借教室
時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。面對海量...