1. 程式人生 > >51Nod - 1105 第K大的數

51Nod - 1105 第K大的數

main stdio.h zha sta pla xmlns row class lib

數組A和數組B,裏面都有n個整數。數組C共有n^2個整數,分別是A00 * B00,A00 * B11......A11 * B00,A11 * B11......An?1n?1 * Bn?1n?1(數組A同數組B的組合)。求數組C中第K大的數。

例如:A:1 2 3,B:2 3 4。A與B組合成的C包括2 3 4 4 6 8 6 9 12共9個數。

Input第1行:2個數N和K,中間用空格分隔。N為數組的長度,K對應第K大的數。(2 <= N <= 50000,1 <= K <= 10^9)
第2 - N + 1行:每行2個數,分別是Aii和Bii。(1 <= Aii,Bii <= 10^9)

Output輸出第K大的數。Sample Input

3 2
1 2
2 3
3 4

Sample Output

9
二分查找 很好的思維題
技術分享圖片
 1 #include <iostream>
 2 using namespace std;
 3 #include<string.h>
 4 #include<set>
 5 #include<stdio.h>
 6 #include<math.h>
 7 #include<queue>
 8 #include<map>
 9 #include<algorithm>
10
#include<cstdio> 11 #include<cmath> 12 #include<cstring> 13 #include <cstdio> 14 #include <cstdlib> 15 #include<stack> 16 #include<vector> 17 long long n,m; 18 long long a[510000]; 19 long long b[510000]; 20 long long zhaogeshu(long long zhi) 21 { 22 23 long
long j=n; 24 long long sum=0; 25 for(int i=1;i<=n;i++) 26 { 27 while(j>0) 28 { 29 if(a[i]*b[j]>zhi) 30 j--; 31 else 32 break; 33 } 34 sum+=j; 35 } 36 return sum; 37 } 38 int main() 39 { 40 cin>>n>>m; 41 memset(a,0,sizeof(a)); 42 memset(b,0,sizeof(b)); 43 for(int i=1;i<=n;i++) 44 scanf("%lld %lld",&a[i],&b[i]); 45 sort(a+1,a+1+n); 46 sort(b+1,b+1+n); 47 long long kaishi=a[1]*b[1]; 48 long long jieshu=a[n]*b[n]; 49 long long weizhi=n*n-m+1; 50 long long mid; 51 long long t=0; 52 while(kaishi<jieshu-1) 53 { 54 mid=(kaishi+jieshu)/2; 55 if(zhaogeshu(mid)>=weizhi) 56 { 57 jieshu=mid; 58 t=mid; 59 } 60 else 61 kaishi=mid; 62 } 63 cout<<t<<endl; 64 return 0; 65 }
View Code

51Nod - 1105 第K大的數