PAT 1045 快速排序

2021-08-18 17:59:54 字數 1198 閱讀 9149

著名的快速排序演算法裡有乙個經典的劃分過程:我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。 給定劃分後的n個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?

例如給定n = 5, 排列是1、3、2、4、5。則:

1的左邊沒有元素,右邊的元素都比它大,所以它可能是主元;

儘管3的左邊元素都比它小,但是它右邊的2它小,所以它不能是主元;

儘管2的右邊元素都比它大,但其左邊的3比它大,所以它不能是主元;

類似原因,4和5都可能是主元。

因此,有3個元素可能是主元。

輸入格式:

輸入在第1行中給出乙個正整數n(<= 105); 第2行是空格分隔的n個不同的正整數,每個數不超過109。

輸出格式:

在第1行中輸出有可能是主元的元素個數;在第2行中按遞增順序輸出這些元素,其間以1個空格分隔,行末不得有多餘空格。

輸入樣例:

5

1 3 2 4 5

輸出樣例:
3

1 4 5

這道題採用的方法有點動態規劃的思想,先從左往右遍歷遍歷一遍得到每乙個數的左邊最大值,再從右往左遍歷一遍陣列得到每個數右邊的最小值,最後一遍遍歷陣列,如果乙個數比它左邊的最大值大且比右邊的最小值小,那麼記錄該資料。

練題還是不多,考慮問題不全面,漏掉了沒有資料符合條件的情況,所以測試點二總是不過,在別人的提示下才發現,即在沒有資料符合的條件下也要輸出乙個空行。

#include using namespace std;

int main()

long maxl[100010];

long minr[100010];

long c[100010];

maxl[0]=0;

minr[n+1]=1000000002;

for(int i=1;i<=n;i++)

else

} for(int i=n;i>=0;i--)

} printf("%d\n",count);

if(count!=0)

printf("%ld",c[k-1]);

} printf("\n");

return 0;

}

PAT 1045 快速排序

1045 快速排序 25 分 著名的快速排序演算法裡有乙個經典的劃分過程 我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。給定劃分後的 n 個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?例如給定 n 5 n 5 n 5,...

pat 1045 快速排序

著名的快速排序演算法裡有乙個經典的劃分過程 我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。給定劃分後的 n 個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?例如給定 n 5 排列是1 3 2 4 5。則 因此,有 3 個...

PAT1045 快速排序 25

題目思路 1.初步我用迴圈做的,發現超時 2.思路改進,觀察給出的樣例和他的輸出 1 3 2 4 5 排序後 1 2 3 4 5 要的結果 1 4 5 是不是有點感覺了呢 3.我就按照這個思路又複製了原來的陣列,將原來的陣列排序後,遍歷對比一下,找到位置相同的,count 4.滿懷好奇,成功了幾個,...