51Nod - 1105 第K大的数
Posted 小小超plus
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51Nod - 1105 第K大的数相关的知识,希望对你有一定的参考价值。
数组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 }
以上是关于51Nod - 1105 第K大的数的主要内容,如果未能解决你的问题,请参考以下文章