題目傳送門:
桶排:對於值域在可以接受的範圍內時,我們可以用不依賴比較的桶排去將資料排序。因為桶排不依賴比較排序,所以他可以打破\(o(nlogn)\)的複雜度下界,變成\(o(max-value)\)的,不過時間是用空間換出來的。
對於每乙個值\(v\),我們都開乙個陣列\(sum[v]\)來當做存放權值為\(v\)的資料的桶,最後一遍\(o(maxv)\)的遍歷就可以將資料排好序了。
對於這個題,我們只要計算出第\(k\)個有值的桶的下標就可以了。
時間複雜度:\(o(maxv)\)
空間複雜度:\(o(maxv)\)
**如下:
#include #include using namespace std;
const int maxn=3e4+5;
int n,k,cnt,maxv;
int a[maxn],sum[maxn];
int read()
int main() //如果這是第k小的就直接輸出
}puts("no result");//否則無解
return 0;
}
洛谷 P1138 第k小整數
此題要求最小的第k個整數,首先我們可以用sort函式對資料進行從小到大排序,然後依次選擇。對以上資料排序得到的結果 例如 1 1 2 2 3 3 4 5 6 7。此時要得到第k個整數。例如,當k 3時,利用迴圈將a i 與a i 1 進行比較,例如 for i 0 i if k 1 這裡判斷k是否等...
洛谷 P1138 第k小整數
現有n個正整數,n 10000,要求出這n個正整數中的第k個最小整數 相同大小的整數只計算一次 k 1000,正整數均小於30000。輸入格式 第一行為n和k 第二行開始為n個正整數的值,整數間用空格隔開。輸出格式 第k個最小整數的值 若無解,則輸出 no result 輸入樣例 1 10 3 1 ...
洛谷題解 P1138 第k小整數
簡單來說 會的人跳過就行 桶排就是開兩個陣列,其中乙個用來輸入以及儲存樣例數列,另乙個用來排序 排序方法 我用的第二個陣列為b陣列 核心 我認為的 先翻譯一下 b陣列為儲存的那個桶,在b陣列中第a i 項的值為a i 的值,這樣等到下乙個a i 與b a i 的值相同時就會重複賦值 我不會優化啊 從...