input
輸入有多個測試用例,每個測試用例是兩行:
第1行是兩個整數n和k,中間用空格隔開(n ≥ k)
第2行有n個整數,每兩個數字中間用空格隔開
輸入以eof結束
output
對於每乙個測試用例,輸出一行,k個整數,就是它的前k大的整數,按照降序排列輸出,每兩個數字之間用空格隔開,最後乙個數字後面沒有空格,有換行。
sample input
5 23 2 4 1 5
sample output
5 4
思路:
1、建立前k個數的小根堆,堆頂為k個數中最小數
2、剩餘n - k個數用arr[i]表示,堆頂用maxarr[0]表示
3、如果maxarr[0] < arr[i],則maxarr[0] = arr[i],並重新建立小根堆,使得堆頂重新為最小數;
如果maxarr[0] >= arr[i],則i++,繼續比較
#include int arr[10001], n, k, count;
int maxarr[10001];
//小根堆排序
int minheap(int i)
int temp;
if (i % 2 == 0)
} else
} i -= 2;
} else
i--;
} cha += minheap(i);
return cha;
}//堆頂元素更改後重新建立小根堆
void chatop() else
} else if (2 * i + 1 >= k) else else
} else else
}} }
return;
}//刪除堆頂,並重新建立小根堆
void deltop(int max) else
} else if (2 * i + 1 >= max) else else
} else else
}} }
return;
}void print()
} std::cout << std::endl;
}int main()
} while (minheap(k - 1));
for (int i = k; i < n; i++)
} count = k - 1;
for (int i = 0; i < k; i++)
print();
} return 0;
}
前k大的數
取前 k 個數,並取出最小值 mi k min k,n 遍歷 第 k 1 n的數,與 mi k 比較。若小於 mi k 遍歷下乙個。若大於 mi k 放入該值,並移除mi k 後,再次取出最小值 mi k min k,n 時間複雜度 o n k 1.將資料分成三個區間 1 k 1,k m,m 1 n...
第k大的數,前k大的數
1 排序後去出前k個,o n log n 如果k2 o nlog k 快排把數分為了兩個部分,所以考慮兩個情況,如果大的部分的個數 k,說明只要繼續在大的部分找就可以了,如果大的部分的個數3 o nlog maxv minv delta 平均為o nlogn 轉化為找第k個,假設最大的數為maxv,...
尋找第K大的數
題目描述 要求在n個不重複的整數中,找出第k大的整數 其中0輸入第一行為兩個正整數n k 第二行為n個整數,輸入保證這n個整數兩兩相異,每個整數的範圍在 1000000到1000000之間 輸出輸出第k大的整數值 樣例輸入 5 33 2 4 5 1 樣例輸出 3 如下 include include...