題目鏈結
題意:
題目給了我們陣列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 ...