在著名的快速排序中,有乙個經典的過程叫做劃分。
在此過程中,我們通常選取其中乙個元素作為分界值。
將小於分界值的元素移到其左側,將大於分界值的元素移到其右側。
給定 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 沒找到 但是要更新最大值用於下次比較 ...