九度OJ 題目1534 陣列中第K小的數字

2021-09-26 14:21:33 字數 1630 閱讀 2258

題目鏈結

題目大意:給出兩個長度分別為m和n的陣列a,b,從兩個陣列中各任選乙個相加,將和放入乙個新陣列c,現在問新陣列從小到大排序後第k個數是多大。 m,n, k(1<=m,n<=100000, 1<= k <= n *m)  陣列元素整型範圍

解題思路:c陣列大小為n*m,而且陣列元素有2e9這麼大,存不下,複雜度高,乍一看無法入手,但是我們思考一下會發現,對於乙個數x,c陣列中小於等於它的個數其實是可以在0(n+m)時間內算出來的:

將a,b兩個陣列排序後,假設對於a中第i個元素a[i]與b中第j個元素b[j]相加小於等於x,即a[i]+b[j] <= x 並且a[i] + b[j+1] > x,那麼對於i+1來說, a[i+1] + b[j+1] > x 一定成立。那麼我們便可以列舉a中每個元素,計算出其與b中多少個元素相加小於等於x,累加之後便得到c中小於等於x的數的個數。複雜度最壞為o(n+m),不算大。

所以,我們只需要二分最小值和最大值之間的數字檢測即可,複雜度o(nlog2e9)。

**:

1

const

int maxn = 1e5 + 10;2

intn, m;

3ll k;

4ll a[maxn], b[maxn];

56 ll check(int

x)15

return

ans;16}

17void

solve()

26 printf("

%lld\n

", l);27}

2829

intmain(){

30 whi

題目:題目1534:陣列中第k小的數字

時間限制:2 秒

記憶體限制:128 兆

特殊判題:

提交:2012

解決:438

題目描述:給定兩個整型陣列a和b。我們將a和b中的元素兩兩相加可以得到陣列c。

譬如a為[1,2],b為[3,4].那麼由a和b中的元素兩兩相加得到的陣列c為[4,5,5,6]。

現在給你陣列a和b,求由a和b兩兩相加得到的陣列c中,第k小的數字。

輸入:輸入可能包含多個測試案例。

對於每個測試案例,輸入的第一行為三個整數m,n, k(1<=m,n<=100000, 1<= k <= n *m):n,m代表將要輸入陣列a和b的長度。

緊接著兩行, 分別有m和n個數, 代表陣列a和b中的元素。陣列元素範圍為[0,1e9]。

輸出:對應每個測試案例,

輸出由a和b中元素兩兩相加得到的陣列c中第k小的數字。

樣例輸入:

2 2 3

1 23 4

3 3 4

1 2 7

3 4 5

樣例輸出:

5

6

google面試題

題目1534 陣列中第K小的數字

題目描述 給定兩個整型陣列a和b。我們將a和b中的元素兩兩相加可以得到陣列c。譬如a為 1,2 b為 3,4 那麼由a和b中的元素兩兩相加得到的陣列c為 4,5,5,6 現在給你陣列a和b,求由a和b兩兩相加得到的陣列c中,第k小的數字。輸入 輸入可能包含多個測試案例。對於每個測試案例,輸入的第一行...

九度OJ 查詢第K小數

題目查詢乙個陣列的第k小的數,注意同樣大小算一樣大。如 2 1 3 4 5 2 第三小數為3。輸入 輸入有多組資料。每組輸入n,然後輸入n個整數 1 n 1000 再輸入k。6 2 1 3 5 2 2 3 輸出 第k小數 3 思路 要找第k小的數,首先想到排序,但是會有重複數字。我的第一想法是去重,...

九度OJ 題目1018

題目1018 統計同成績學生人數 題目描述 讀入n名學生的成績,將獲得某一給定分數的學生人數輸出。輸入 測試輸入包含若干測試用例,每個測試用例的格式為 第1行 n 第2行 n名學生的成績,相鄰兩數字用乙個空格間隔。第3行 給定分數 當讀到n 0時輸入結束。其中n不超過1000,成績分數為 包含 0到...