Description
现在有两个数组 A 和 B, 分别包含 x 与 y 个元素。
定义一个新的数组 C, C 中包含 x×y 个元素,为 A 中所有元素除以 B 中所有元素。
即 新集合为 {c∣c=ab,a∈A,b∈B} 。特殊地,C 为多重集合。
请求 C 数组的第 k 大数。
Input
第一行一个整数 T(T≤3)表示方案数。
对于每个方案:
第一行三个整数 n,m,k(0<n,m≤100000,0<k≤n×m )
第二行 n 个正整数;
第三行 m 个正整数。
数组中元素 <108。
Output
对于每个方案,输出一行:
数组 C 的第 k 大数。结果四舍五入到两位小数。
Sample Input
2
5 5 3
1 2 3 4 5
2 3 4 5 6
5 5 2
1 2 3 4 5
2 3 4 5 6
Sample Output
1.672.00
// // main.cpp // 周赛一 // // Created by liuzhe on 16/6/1. // Copyright © 2016年 my_code. All rights reserved. // #include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <cstring> #include <cmath> #include <set> #include <map> #include <iostream> using namespace std; double a[100010],b[100010]; multiset<double>mset; multiset<double>::iterator it; int main() { int t; scanf("%d",&t); while(t--) { mset.clear(); int n,m,k; scanf("%d%d%d",&n,&m,&k); for(int i=0;i<n;i++) scanf("%lf",&a[i]); for(int i=0;i<m;i++) scanf("%lf",&b[i]); double x; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { x=a[i]/b[j]; mset.insert(x); } int w=n*m-k; for(it=mset.begin();it!=mset.end();it++) { if(!w) break; w--; } printf("%.2lf\n",*it); } return 0; }