分治 001 輸出前k大的數

2021-10-04 06:08:49 字數 1768 閱讀 5772

總時間限制: 10000ms 單個測試點時間限制: 1000ms 記憶體限制: 65536kb

描述

給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。

輸入

第一行包含乙個整數n,表示陣列的大小。n < 100000。

第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過100000000。

第三行包含乙個整數k。k < n。

輸出從大到小輸出前k大的數,每個數一行。

樣例輸入

1045

6987

1230

5

樣例輸出

987

65

解法

若排序整個列表,浪費很多資源;

故可把前m大的數放在陣列右邊排序,再輸出

將前m大的移到右邊

快排方法,將a[0]放到a[i],若i=n-m+1,則該數左標比自身小,右邊比自身大,排序該數右邊即可;

若in-m+1,則查詢左邊;

#include

using

namespace std;

void

swap

(int

&a,int

&b)//交換函式

void

quicksort

(int a,

int s,

int e)

//快速排序

swap

(a[i]

,a[j]);

//發現後比前小的,swap(i,j)

while

(i<=k)

//前比後小的,前往後移

swap

(a[i]

,a[j]);

}//最後a[i]即為a[s]的正確位置

quicksort

(a,s,i-1)

;//比a[i]小的排序

quicksort

(a,i+

1,e)

;//比a[i]大的排序

}void

arrangeright

(int a,

int s,

int e,

int k)

swap

(a[i]

,a[j]);

while

(i<=key)

swap

(a[i]

,a[j]);

}//比較a[i]的位置,是否比是第n-k個元素

if(k==e-i+1)

return

;//若是,則返回

if(e-i+

1>k)

arrangeright

(a,i+

1,e,k)

;//k小,則排序k右邊比k大的,接著判斷

if(e-i+

1arrangeright

(a,s,i-

1,k-e+i-1)

;//k大,則排序k左邊比k小的,接著判斷

//直到找到第n-k大的元素,全部排序其右邊即可

}int a[

100000];

int n;

int k;

intmain()

return0;

}

001 輸出前k大的數

描述 給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。輸入第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過100000000。第三行包含乙個整數k。k n。輸出從大到小輸出前k大的數,每個數一行。樣例輸...

分治專題 輸出前k大的數

給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。分治 把乙個問題分解成形式和原任務相同,但規模更小的幾個部分任務 通常是兩個部分 分別完成,或只需要選一部分完成。然後再處理完成後的這乙個或幾個部分的結果,實現整個任務的完成。把前m大的都弄到陣列的右邊,然後對最右邊的m個元素排序再輸出。o n...

輸出前k大的數

010 輸出前k大的數 總time limit 10000ms 單個測試點時間限制 1000ms memory limit 65536kb description 給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。input 第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n...