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...