PAT甲級真題1101 快速排序(DP)

2021-10-14 04:01:52 字數 1091 閱讀 5537

在著名的快速排序中,有乙個經典的過程叫做劃分。

在此過程中,我們通常選取其中乙個元素作為分界值。

將小於分界值的元素移到其左側,將大於分界值的元素移到其右側。

給定 n個不同的正整數進行過一次劃分後的排列情況。

請你判斷,共有多少元素可能是此次劃分的分界值。

例如,n=5,各元素排列為 1,3,2,4,5,則:

1 可能是分界值,因為它的左側沒有元素,而右側的元素都比它大。

3 一定不是分界值,因為儘管它的左側的元素都比它小,但是它右側的 2 也小於它。

2 一定不是分界值,因為儘管它的右側的元素都比它大,但是它左側的 3 也大於它。

出於類似判斷可知 4,5 也可能是分界值。

因此,在此樣例中,共有 3 個可能的分界值。

輸入格式

第一行包含整數 n。

第二行包含 n 個不同的正整數。

輸出格式

第一行輸出可能的分界值數量。

第二行按公升序順序輸出所有可能的分界值。

如果分界值數量為 0,則在輸出分界值數量後,輸出乙個空行即可。

資料範圍

1≤n≤10的5次方,

1≤ 給定元素 ≤10的9次方。

輸入樣例:51

3245

輸出樣例:31

45

#include

using

namespace std;

const

int n=

100010

,inf=

2e9;

int n;

int a[n]

,maxn[n]

,minn[n]

;int

main()

} cout

(s.begin()

,s.end()

);bool flag=

false

;for

(auto it:s)

else cout<<

' '<} cout

}

pat 甲級 1101(細節題)

思路 找合適作為pivot point的點,要求是左邊的數字全部小於它,並且右邊的數字全部大於它 可以先從左開始向右判斷符合左邊數字全小於它的 大於最大值 然後再從右向左判斷右邊數字大於它的 小於最小值 注意 結尾一定要將換行分開輸出,不然寫成cout 要求的兩行不符。include include...

PAT甲級真題1153

pat 准考證號由 44 部分組成 第 11 位是級別,即 t 代表頂級 a 代表甲級 b 代表乙級 第 2 42 4 位是考場編號,範圍從 101101 到 999999 第 5 105 10 位是考試日期,格式為年 月 日順次各佔 22 位 最後 11 1311 13 位是考生編號,範圍從 00...

快速排序 pat1101

include include include includeusing namespace std const int maxv 1e5 5 且本體不能硬排,多個for套for 的求出第i個的左邊最大,右邊最小會超時 int main if b i maxd 沒找到 但是要更新最大值用於下次比較 ...