Description

现在有两个数组 AA 和 BB, 分别包含 xx 与 yy 个元素。

定义一个新的数组 CC, CC 中包含 x×yx×y 个元素,为 AA 中所有元素除以 BB 中所有元素。

即 新集合为 {c∣c=ab,a∈A,b∈B}{c∣c=ab,a∈A,b∈B} 。特殊地,CC 为多重集合。

请求 CC 数组的第 kk 大数。

Input

第一行一个整数 TT(T≤3T≤3)表示方案数。

对于每个方案:

第一行三个整数 n,m,kn,m,k(0<n,m≤100000,0<k≤n×m0<n,m≤100000,0<k≤n×m )

第二行 nn 个正整数;

第三行 mm 个正整数。

数组中元素 <108<108。

Output

对于每个方案,输出一行:

数组 CC 的第 kk 大数。结果四舍五入到两位小数。

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

题解:这个题乍一看想FFT,其实没有那么麻烦,只是个简单的二分答案。

如果一个数是第K大的数,那么一定存在至少K个数小于等于它,把这个作为二分的条件。

如何判断有K个数小于等于它呢,好像不是很好判断,我们转换为计算大于x的数的个数。

我们可以把A数组和B数组排序,然后用双指针,指针Pa指向数组A的左端,指针Pb指向数组B的左端,这样固定Pa,把Pb像右移动,直到(*Pa)/(*Pb) < x为止,然后Pa向右移动一个,再循环这个操作,直到Pa到头或者Pb到头(可以证明Pb始终不需要掉头)

check函数的代码:

int check(double x)
{int tot = 0;int pos = 0; for(int i = 0;i < N;i++){while(pos < M && (double)A[i]/(double)B[pos] >= x) pos++;tot += pos;}return tot;
}

代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 100005;
const double EPS = 0.001;
int A[MAX],B[MAX];
int N,M,K;
int check(double x)
{int tot = 0;int pos = 0; for(int i = 0;i < N;i++){while(pos < M && (double)A[i]/(double)B[pos] >= x) pos++;tot += pos;}return tot;
}
int main()
{int T;scanf("%d",&T);while(T--){scanf("%d%d%d",&N,&M,&K) ;for(int i = 0;i < N;i++) scanf("%d",&A[i]);for(int i = 0;i < M;i++) scanf("%d",&B[i]);sort(A,A + N);sort(B,B + M);double l = 0,r = A[N-1];while(r - l > EPS){double mid = (r + l) /2;if(check(mid) < K) r = mid;//检查大于mid的数有多少个 else l = mid; }printf("%.2f\n",l);}return 0;} /*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*/

数学题 贪心+二分答案相关推荐

  1. P5021-赛道修建【平衡树,贪心,二分答案】

    正题 题目链接:https://www.luogu.org/problemnew/show/P5021 题目大意 一棵树找mmm条不重边路径使得最短的那条最长. 解题思路 首先最小的最大显然二分一下答 ...

  2. 洛谷3933 Chtholly Nota Seniorious 二分答案+贪心

    题目链接 题意 给你一个N*M的矩阵 (N,M <=2000)  把他分成两部分 使两部分的极差较大的一个最小  求这个最小值.然后分矩阵的要求是:每个部分内部的方块之间,可以通过上下左右相互到 ...

  3. 【BZOJ3048】Cow lineup,贪心+队列维护(或二分答案)

    传送门(权限题) 题面: 3048: [Usaco2013 Jan]Cow Lineup Time Limit: 2 Sec Memory Limit: 128 MB Submit: 121 Solv ...

  4. CodeVS1725 探险 【二分答案】【贪心】

    [题目描述] 有编号为1至n的n个同学一起去探险,现在把他们分成k个小组,每个小组完成一项探险任务.分组时,如果第i人与第j人分在同一组(i < j),则他们之间的所有人(第i+1,i+2,-, ...

  5. 洛谷P1182 数列分段Section II 二分答案

    洛谷P1182 数列分段Section II 二分答案 题意:将 n 个 数 分为 m段 求一种方案,使这m段中最大的和 最小 额..可能有点拗口,其实就是说每一种方案,都有对应的 每段和的最大值, ...

  6. LuoguP1948 电话线 【二分答案/图论】

    其实是和奥格瑞玛一样的题啦. 但还是想了很久后看了题解. 多年以后,笨笨长大了,成为了电话线布置师.由于地震使得某市的电话线全部损坏,笨笨是负责接到震中市的负责人.该市周围分布着N(1<=N&l ...

  7. Luogu P2920 时间管理【二分答案】

    二分答案水题. (像我这么蒻的人都能十几分钟A掉) https://www.luogu.org/problemnew/show/P2920 开始时间一定在从0到min(t[i]-s[i])的一段区间上 ...

  8. 牛客 - Sixth Sense(贪心+二分)

    题目链接:点击查看 题目大意:给出两个长度为 n 的数列记为 a 和 b,现在 a 的数列固定不动,问如何对数列 b 进行排列,可以使得: b[ i ] > a[ i ] (严格大于)的位置尽可 ...

  9. 紫书 例题8-10 UVa 714 (二分答案)

    这道题让最大值最小, 显然是二分答案 当题目求的是最大值最小, 最小值最大, 这个时候就要想到二分答案 为什么可以二分答案呢, 因为这个时候解是单调性的, 如果简单粗暴一点 就全部枚举一遍, 验证答案 ...

最新文章

  1. 图片的另一种展现—将后台图片编码直接展现为图片
  2. centos在线安装mysql
  3. XCTF-高手进阶区:bug
  4. python提取视频中的音频 代码_如何使用python从视频文件中提取音频?
  5. python如何爬取sci论文_通过爬虫确定SCI期刊的发表周期
  6. 二次优化问题dfp_MATLAB优化问题应用实例讲解
  7. 进大学时高考成绩是班里第一,同样也是努力学习,为什么大学时做不到第一了呢?
  8. js可以控制文件上传的速度吗?
  9. EntityFramework Codefirst Select 查询指定列
  10. 论文阅读笔记(六)——GhostNet: More Features from Cheap Operations
  11. Atitit.提升语言可读性原理与实践
  12. win 安装 Xshell 5
  13. PHP常用函数集合(可做桌面壁纸)
  14. IDEA单击打开文件
  15. 《计算机网络自顶向下》笔记
  16. 美通社日历 | 媒体关注、会展信息、企业财报发布,节假日备忘(8月3日—8月9日)...
  17. github 思维导图开元软件_哪款思维导图软件比较好用?
  18. Python+pandas分离Excel数据到同一个Excel文件中多个Worksheets
  19. 2018校招笔试题——网易编程题跳石板
  20. Java JDBC数据库简单使用,封装连接,关闭

热门文章

  1. jenkins换服务器找不到包,服务器重启后Jenkins项目部分丢失问题解决方法
  2. 紧跟月影大佬的步伐,一起来学习如何写好JS(上)
  3. [Redis6]key键操作
  4. [SpringSecurity]web权限方案_用户认证_设置用户名密码
  5. [Java基础]反射获取构造方法并使用
  6. [C++11]基于范围的for循环
  7. [蓝桥杯][历届试题]网络寻路-dfs,图的遍历
  8. 快速排序 (Quick Sort)(Java实现)
  9. 深入理解 JVM Class文件格式(六)
  10. HDU - 7084 Pty loves string kmp + fail树 + 主席树