51nod 第K大的數

2021-10-19 19:41:55 字數 1161 閱讀 3775

題目鏈結

題意:

題目給了我們陣列a和b,然後給了c陣列中各個元素是由陣列a和b相應元素相乘得到。讓我們求出陣列c中的第k大元素的值。

題解:

這道題目陣列a和b的長度n是5e4,因此直接不能直接求出所有陣列c元素的值。

這類求第k大的問題,有時可以使用二分的方法進行求解。

這道題目二分的思路就是,將陣列a和陣列b進行排序,首先二分這個第k大元素的值mid,然後在check函式當中,對陣列a的每個元素二分找到與a[i]相乘大於mid的最小的b[j],那麼顯然b[j]之後的所有陣列b的元素與a[i]相乘都會大於當前的mid,個數num累加n - j + 1,用num與k進行比較,即可知道當前第k大的數是大了還是小了,然後進一步二分即可。

細節見**:

#include

using

namespace std;

typedef

long

long ll;

const

int maxn =

5e4+10;

ll n, k;

ll a[maxn]

, b[maxn]

;ll is

(ll now, ll x)

else

} ll ans = n - l -1;

if(b[l]

* x > now) ans++

;return ans;

}bool

check

(ll mid)

if(num +

1<= k)

return

true

;return

false;}

intmain()

sort

(a, a + n)

;sort

(b, b + n)

; ll l = a[0]

* b[0]

, r = a[n -1]

* b[n -1]

;// 二分第k大元素的值

while

(l < r)

else

} cout << l << endl;

return0;

}

51Nod 1105 第K大的數

acm模版 這裡使用二分套二分查詢即可。一般的二分查詢是通過下標範圍查詢,而二分套二分是為了求兩個陣列組合乘積的問題,查詢第k大的值,這裡我們需要通過資料的範圍查詢,而不是下標的範圍,這裡需要兩次快排。需要強調的一點是資料範圍問題!一定要使用long long型,避免資料溢位!include inc...

51nod 1105 第K大的數

1105 第k大的數 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 陣列a和陣列b,裡面都有n個整數。陣列c共有n 2個整數,分別是a 0 b 0 a 0 b 1 a 1 b 0 a 1 b 1 a n 1 b n 1 陣列a同陣列b的組合 求陣列c中第k大的數...

51nod 1105第K大的數

1105 第k大的數 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 陣列a和陣列b,裡面都有n個整數。陣列c共有n 2個整數,分別是 a 0 b 0 a 0 b 1 a 0 b n 1 a 1 b 0 a 1 b 1 a 1 b n 1 a n 1 b 0 a ...