010:輸出前k大的數
總time limit: 10000ms 單個測試點時間限制: 1000ms memory limit: 65536kb
description
給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。
input
第一行包含乙個整數n,表示陣列的大小。n < 100000。
第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過100000000。
第三行包含乙個整數k。k < n。
output
從大到小輸出前k大的數,每個數一行。
sample input
104 5 6 9 8 7 1 2 3 0
5sample output98
765解題思路:
排序後再輸出,複雜度 o(nlogn)
用分治處理:複雜度 o(n+mlogm)
思路:把前m大的都弄到陣列最右邊,然後對這最右邊m個元素排序, 再輸出
關鍵 :o(n)時間內實現把前m大的都弄到陣列最右邊
引入操作 arrangeright(k): 把陣列(或陣列的一部分)前k大的 都弄到最右邊
如何將前k大的都弄到最右邊
1)設key=a[0], 將key挪到適當位置,使得比key小的元素都在 key左邊,比key大的元素都在key右邊(線性時間完成)
2) 選擇陣列的前部或後部再進行 arrangeright操作
a > k ————對最右邊a-1個元素再進行arrangerigth(k)
a < k ————對左邊b個元素再進行arrangeright(k-a)
#include #include #include using namespace std;
int a[100010];
void arrangeright(int s,int e,int k) //把陣列的前 k 大的元素都弄到最右邊
//處理完後,a[i] = key
int sum = e+1 - i;//陣列中從key開始往右的元素個數和
if(sum == k) //完成
return ;
else if(sum > k) //對最右邊的 sum-1 個元素再進行arrangeright(k)
arrangeright(i+1,e,k);
else if(sum < k)
arrangeright(s,i-1,k-sum); // 對左邊 b(key之前的元素個數) 個元素再進行arrangeright(k-sum)
}int main()
輸出前 k 大的數
總時間限制 10000ms 單個測試點時間限制 1000ms 記憶體限制 65536kb 描述 給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。輸入第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過100...
輸出前k大的數
總時間限制 10000ms單個測試點時間限制 1000ms記憶體限制 65536kb noi 描述給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。輸入第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過10...
C 輸出前K大的數
總時間限制 10000ms 單個測試點時間限制 1000ms 記憶體限制 65536kb 描述給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。輸入第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過1000...