【問題描述】
有兩個正整數數列,元素個數分別為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。沒有想到什麼好...