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大的數。
例如:a:1
23,b:2
34。a與b組合成的c包括234
4686
912共9個數。
input
第1行:2個數n和k,中間用空格分隔。n為陣列的長度,k對應第k大的數。(2
<= n
<= 50000,1
<= k
<= 10^9)
第2 - n + 1行:每行2個數,分別是a[i]和b[i]。(1
<= a[i],b[i] <= 10^9)
output
輸出第k大的數。
input示例32
1223
34output示例
9李陶冶 (題目提供者)
原來二分還能這樣用!
對給定的x
列舉陣列a
二分法確定b中多少個數》=x/a
那就在n*log(n)內找到c中》=x的數的個數
那只要再用二分法求出 c中》=x的數的個數 = k 的這個x就行了
複雜度n*log(n)*log(max(a[i])*max(b[i]))
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#include
using
namespace
std;
#define ll long long
#define ull unsigned long long
#define pii pair
#define inf 1000000007
#define pll pair
#define pid pair
const
int n = 5e4+5;
ll a[n];
ll b[n];
pll f(ll x,ll n)
}return make_pair(ans1,ans2);
}ll binarysearch(ll n,ll k)
else}}
}int main()
printf("%lld\n",binarysearch(n,k));
}return
0;}
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 ...