noip模擬賽 第K小數

2022-05-01 07:57:10 字數 2366 閱讀 6387

【問題描述】

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

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

【輸入格式】

輸入檔名為number.in。

輸入檔案包含三行。

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

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

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

【輸出格式】

輸出檔名為number.out。

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

【輸入輸出樣例1】

number.in

number.out

2 3 4

1 22 1 3

3【輸入輸出樣例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小/大之類的顯然可以二分,看比它小的數有多少個,統計個數主要還是乘法原理,將兩個序列排序,然後移動兩個指標,乙個從小到大,乙個從大到小,因為滿足單調性,乙個乘法就解決了.

#include #include 

#include

#include

using

namespace

std;

typedef

long

long

ll;ll n, m, k, a[

200010], b[200010

], max1, max2, ans, cnt1, cnt2;

ll check(ll x)

return

sum;

}int

main()

for (ll i = 1; i <= m; i++)

sort(a + 1, a + 1 +n);

sort(b + 1, b + 1 +m);

ll l = 1, r = max1 *max2;

while (l <=r)

else

l = mid + 1

; }

printf(

"%lld\n

", ans);

return0;

}

noip模擬賽 第k大區間

問題描述 定義乙個長度為奇數的區間的值為其所包含的的元素的中位數。現給出n個數,求將所有長度為奇數的區間的值排序後,第k大的值為多少。輸入 輸入檔名為kth.in。第一行兩個數n和k 第二行,n個數。0 每個數 231 輸出 輸出檔名為kth.out。乙個數表示答案。輸入輸出樣例 kth.in kt...

牛客 第k小數 線性尋找第 k 小數

題目大意 給出長度為 n 的數列 a 要求找到第 k 小的數 題目分析 因為資料給的足夠大,所以約束就是必須線性完成操作,stl 中的 nth element 函式可以完美實現操作,算是學到了一波,格式 nth element a.begin a.begin k a.end 那麼 a k 就是第 k...

求第k小數

求第k小數,無非就是考查排序,請參考我最新的博文吧求第k小數 直接使用priority queue,在網上看到許多使用快排來求第k小數都是認為第k小就是排好序陣列中第k個元素,但是如果陣列中有相同的元素呢,例如 1,2,2,2,3,5 認為第三小是3還是2呢?我刷題時遇到的是認為是3。沒有想到什麼好...