洛谷題解 P1138 第k小整數

2022-01-12 12:24:50 字數 812 閱讀 7835

簡單來說(會的人跳過就行):

桶排就是開兩個陣列,其中乙個用來輸入以及儲存樣例數列,另乙個用來排序;

排序方法:(我用的第二個陣列為b陣列)

核心**(我認為的),先翻譯一下:b陣列為儲存的那個桶,在b陣列中第a[i]項的值為a[i]的值, 這樣等到下乙個a[i]與b[a[i]]的值相同時就會重複賦值(我不會優化啊 )從而實現了去重;

而在輸出環節時用for迴圈;因為for的性質我們一般用

來輸出,i逐漸遞增,用乙個特判if(b[i]!=0)來判斷是否在原陣列中有賦值(題目給的是正整數,只要不等於零就有值) 如果成立,輸出就行,這樣就實現了去重和排序雙重功能!

沒懂的多讀幾遍;

上ac**! (25ms,0.8mb)

#includeusing

namespace

std;

int a[10001],k,n,i1,k1=0,b[30000

];//

a,b為上面提到的第一,第二個陣列

intmain()

for(int i=1;;i++) //

為何沒迴圈條件?請看下文k1==k

else

if(i==30000)//

很簡單,數最大不到30000,如果i到了30000還沒有到第k小的數,那就不可能存在了。如果不加這個條件會無限迴圈.

}cout

如果執行到了這一步,那麼就存在k,直接輸出第k個小的數就行。

return0;

}

應該。。沒問題了吧

洛谷 P1138 第k小整數

題目傳送門 桶排 對於值域在可以接受的範圍內時,我們可以用不依賴比較的桶排去將資料排序。因為桶排不依賴比較排序,所以他可以打破 o nlogn 的複雜度下界,變成 o max value 的,不過時間是用空間換出來的。對於每乙個值 v 我們都開乙個陣列 sum v 來當做存放權值為 v 的資料的桶,...

洛谷 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 ...