題目描述:給你n個整數,請按照從大到小的順序輸出其中前m大的數。
輸入:每組測試數據有兩行,第一行有兩個數n,m(0<n,m<1000000),第二行包含n個整數(一個數字可能有多個),且都處於區間【-500000,500000】內
輸出:對每組測試數據按從大到小的順序輸出前m大的數。
時間限制:1秒 內存:128M
樣例輸入:
5 3
3 -35 92 213 -644
樣例輸出:
213 92 3
分析:
1.待排序數字數量龐大(1000000),即使用時間復雜度為O(nlogn)的快排,時間復雜度也會達到千萬數量級,而在時限1秒內是不能接受的。所以不能用快速排序。
2.輸入數字為整數,區間在【-500000,500000】,可以用hasn數組將數字作為下標保存每個數據。空間內存也不會超出。從頭遍歷數組,其時間復雜度仍在百萬數量級。
注意: 要注意數據的輸出格式,最后一個輸出后面不加空格。(養成好習慣)
1 #include<cstdio> 2 using namespace std; 3 4 int offset=500000; //偏置 5 int Hash[1000005]={0}; 6 int main() 7 { 8 int n,m; 9 while(scanf("%d%d",&n,&m)!=EOF){ 10 int k; 11 for(int i=0;i<n;i++){ 12 scanf("%d",&k); 13 Hash[k+offset]++; //統計k輸入了多少次 14 } 15 16 //輸出前m個大的數 17 for(int j=1000000;j>=0;j--){ 18 while(Hash[j]&&m){ 19 if(m==1){ 20 //注意輸出格式,最后一個輸出后面不加空格。(養成好習慣) 21 printf("%d",j-offset); 22 Hash[j]--; 23 m--; 24 } 25 else{ 26 printf("%d ",j-offset); 27 Hash[j]--; 28 m--; 29 } 30 } 31 } 32 } 33 return 0; 34 }