兩個數列取第k小數

2021-07-24 17:03:58 字數 1805 閱讀 6642

1 1 .第k k 小數

( ( number .cpp/c/pas)

【問題描述】

有兩個正整數數列,元素個數分別為n和m。從兩個數列中分別任取乙個數

相乘,這樣一共可以得到n*m個數,詢問這n*m個數中第k小數是多少。

【輸入格式】

輸入檔名為number.in。

輸入檔案包含三行。

第一行為三個正整數n,m和k。

第二行為n個正整數,表示第乙個數列。

第三行為m個正整數,表述第二個數列。

【輸出格式】

輸出檔名為number.out。

輸出檔案包含一行,乙個正整數表示第k小數。

【輸入輸出樣例1 1 】

number.in  number.out

2 3 4

1 22 1 3

3【輸入輸出樣例2 2 】

number.in  number.out

5 5 18

7 2 3 5 8

3 1 3 2 5

16【資料規模與約定】

樣例點編號  n  m  k  元素大小(≤)

1  20  20  150  10^4

2  50  50  2000  10^4

3  100  80  5000  10^9

4  200  200  26000  10^9

5  10000  10000  50050000  10^4

6  1000  20000  9500000  10^4

7  1000  20000  10000500  10^9

8  2000  20000  190000  10^9

9  2000  20000  199000  10^9

10  20000  20000  210005000  10^4

11  20000  20000  210000  10^5

12  20000  20000  200000  10^9

13  20000  20000  220000500  10^5

14  20000  20000  199000500  10^9

15  200000  200000  180000  10^4

16  200000  200000  200000  10^9

17  2000  200000  100001500  10^9

18  200000  180000  19550000000  10^5

19  200000  200000  19900010000  10^9

20  200000  200000  20000010000  10^9

分析:

對於這個問題,如果乙個問題取第k小數,模擬前面的poj2104,我們可以知道用二分,我們二分結果,然後計算有多少個數比其小。

要注意的是,計算個數也是有技巧的。僅僅是兩層迴圈是不可以的。我們可以先排好序,要知道a[i]*b[j]>=mid那麼a[i+1]*b[j]>=mid,具體細節看程式。

#include#includeusing namespace std;

typedef long long ll;

const int maxn=210000;

ll a[maxn],b[maxn];

int n,m;

ll k;

int main()

if (sum>=k)r=mid;

else l=mid;

} printf("%lld",l);

return 0;

}

第k大數 兩個陣列元素相乘後的第k大

分析 二分,兩邊夾,細節見 複雜度為o 2nlog maxa maxb 一 include include include include using namespace std typedef long long ll const int maxn 100010 ll a maxn b maxn ...

ios取兩個數之間的隨機小數 iOS 生成隨機數

objective c中並沒有提供生成隨機數的函式,所以使用c中提供的rand srand random arc4random 幾個函式。1.使用 arc4random 生成隨機數 1.1 隨機整數 範圍在 0,100 包括0,不包括100 int x arc4random 100 1.2 隨機整數...

和為K的兩個數

一 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。var array 1,3,5,8,10 var sum 13 function getarray array,sum return result console.lo...