轉跳點:?
1045 快速排序 (25分)
著名的快速排序演算法裡有乙個經典的劃分過程:我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。 給定劃分後的 n 個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?
例如給定 $n = 5$, 排列是1、3、2、4、5。則:
因此,有 3 個元素可能是主元。
輸入在第 1 行中給出乙個正整數 n(≤105); 第 2 行是空格分隔的 n 個不同的正整數,每個數不超過 109。
在第 1 行中輸出有可能是主元的元素個數;在第 2 行中按遞增順序輸出這些元素,其間以 1 個空格分隔,行首尾不得有多餘空格。
5
1 3 2 4 5
3
1 4 5
這道題實現起來並不難,但是吧,時間複雜度的控制是乙個很麻煩的事情。
我ac的思路如下:
對原序列sort排序,逐個比較,若當前元素沒有變化並且它左邊的所有值的最大值都比它小的時候就可以認為它一定是主元(很容易證明正確性的,畢竟無論如何當前這個數要滿足左邊都比他小右邊都比他大,那它的排名一定不會變)~
說白了就是找區間最大值(只不過我這裡利用了之前比較的結果),如果前面的都比當前元素小那麼,它的比左邊都大就成立了,如果他還比右邊小那麼,肯定是主元。如果 右邊比區間最大值小,那麼記下來區間最大值,從從這個值開往後,如此往復就得出答案啦
ac**:
#include #include int cmp(const void *a, const void *b)
int main()
qsort(cn, n, sizeof(cn[0]), cmp);
for (int i = 0; i < n; i++)
if (max == a[i] && a[i] == cn[i])
}printf("%d\n", count);
if (0 == count)
for (int i = 0; i < count; i++)
return 0;
}
我又看了一些部落格,說什麼快速排序前後主元位置不變……人家快排都不穩定好不好……
例如序列3 2 1 4 5,排序後,是1 2 3 4 5,通過比較主元為2 4 5,一看就是錯的lo,2肯定不是主元啦~
快速排序重新排序後,與原序列比較,位置不變的元素,只是有可能是主元,也會混入非主元元素的啦~
所以:主元一定包含在了排序後位置不變的元素中,但位置不變的元素不一定是主元。
pta不易,諸君共勉!
洛谷P1045 麥森數
形如2 12p 1的素數稱為麥森數,這時p p 一定也是個素數。但反過來不一定,即如果p p 是個素數,2 12p 1不一定也是素數。到1998年底,人們已找到了37個麥森數。最大的乙個是p 3021377p 3021 377 它有909526位。麥森數有許多重要應用,它與完全數密切相關。任務 從檔...
洛谷P1045麥森數
題幹很簡單,就是要求2的p次方 1的位數和後500位。首先我們肯定不會去把這個數算出來,不然鐵t,那怎麼算位數呢?於是我們想一想數學方法因為2的p次方個位數必不為0,所以2的p次方 1的位數和2的p次方位數相同。又有10的n次方是n 1位數所以轉化一下2的p次方就是10的log10 2 p 1位數,...
洛谷 P1045 麥森數
不會快速冪的我只能瘋狂壓位 dalao們請無視 這是本蒟蒻滴第一篇洛谷題解還請多多包涵鴨!好吧先看看我的辛路歷程 剛看到這題的時候,我第一反應是壓位,於是我從未壓位到 5壓到 10,吸氧後發現後兩者都是60分 o o 於是乎我將2p次方轉化為1024n m,以及220n m來運算,結果只有70分 最...