第k大的數

2021-07-24 15:31:50 字數 1248 閱讀 3864

題目:

陣列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 2 3,b:2 3 4。a與b組合成的c包括2 3 4 4 6 8 6 9 12共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示例

3 2

1 22 3

3 4

output示例

9

思路:

很開心跟著學長一起學二分,然後有乙隻熊推薦我們能夠用二分優化這道題目,剛開始看到題目的時候首先想到的就是計算完直接排序找,但是這是個四級演算法題,超時是肯定的,然後就不知道該從何做起了,經過熊的提示,我慢慢想到了這道題的解決方法也知道了該從何優化,首先我對這兩個陣列分別進行了排序,然後用兩個for迴圈從min=a[0]*b[0]到max=a[m-1][n-1]開始統計之間每個數在其中占得位置,我統計了比它大的數,知道恰好的時候停止,但是明顯這樣也會超時,然後開始慢慢優化,第乙個優化就是比較得到比它小的停止乙個迴圈,sum開始根據情況相加,詳細會在**中,然後外迴圈通過二分來優化,

然後還是有幾組資料超時,最後學長提醒我可以把內部for迴圈中j提到外部,可以減少計算時間,然後就過了,雖然做了很長時間還是挺開心的。下面貼出我的**

#include#includeusing namespace std;

#define maxs 500010

long long a[maxs],b[maxs];

long long m,k,w,f,i;

int main()

sort(a,a+m);

sort(b,b+m);

long long mi=a[0]*b[0],ma=a[m-1]*b[m-1];

long long s,j,w,f;

long long low=mi;

long long high=ma,mid=0;

while(low<=high)

cout<

第k大的數,前k大的數

1 排序後去出前k個,o n log n 如果k2 o nlog k 快排把數分為了兩個部分,所以考慮兩個情況,如果大的部分的個數 k,說明只要繼續在大的部分找就可以了,如果大的部分的個數3 o nlog maxv minv delta 平均為o nlogn 轉化為找第k個,假設最大的數為maxv,...

第K大的數

這道題是我去年聽說的,一次比賽悲劇的,前幾天ac的,大體思路是二分答案,記住在統計的時候,複雜度為n,而不是nlogn,這道題複雜度為 nlog max min include include includeusing namespace std define maxn 51000 int64 a ...

第K大的數

陣列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 2 3,b 2 3 4。a與b組合成的c包括2 3 4 4 6 8 6 9 12共9個數。...