1540: 第k大数
Time Limit: 10 Sec  Memory Limit: 128 MB
[Submit][Status][Web Board]
Description
有两个序列a,b,它们的长度分别为n和m,那么将两个序列中的元素对应相乘后得到的n*m个元素从大到小排列后的第k个元素是什么?

Input
输入的第一行为一个正整数T (T<=10),代表一共有T组测试数据。

每组测试数据的第一行有三个正整数n,m和k(1<=n, m<=100000,1<=k<=n*m),分别代表a序列的长度,b序列的长度,以及所求元素的下标。第二行为n个正整数代表序列a。第三行为m个正整数代表序列b。序列中所有元素的大小满足[1,100000]。

Output
对于每组测试数据,输出一行包含一个整数代表第k大的元素是多少。

Sample Input
3
3 2 3
1 2 3
1 2
2 2 1
1 1
1 1
2 2 4
1 1
1 1
Sample Output
3
1
1

显然这道题要先对a,b数组排序,这是一定的。
然后,l=a[0]*b[0],r=a[n-1]*b[m-1]开始去查找mid是第几大的数
除了二分之外,这里就算第几大的数这个思路直接关系到会不会TLE.在寻找是第几大数的时候.具体的见代码的注释部分.
还有要说明的时候就是在二分的时候要注意不能当mid满足条件的时候就直接返回结果,这个时候的mid可能在第k+1大个数以及第k大的数之间.
#include <cstdio>
#include <algorithm>
using namespace std; int n,m,k;
long long a[];
long long b[];

// o(m+n)的思路一个数在由a,b两两相乘得到序列c中属于第几大的数
long long judge(long long mid)
{
int sum=;
int j=;
for(int i=n-;i>=;i--) // 从最大的i开始枚举,因为a,b都是有序的当i情况枚举完之后,后续成立的枚举情况一定在i-1中
for (;j<m;j++) // 当a[i+1][j]满足不了的时候,a[i][j]也是一定满足不了的, 这里就不用重复枚举了,按照前一轮记录的结果来就行了
if(a[i]*b[j]>=mid)
{
sum+=m-j;// 当j满足的时候,后续的结果也是一定满足的
break;
}
return sum;
} int main()
{
int pp;scanf("%d",&pp);
while(pp--)
{
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<n;i++)scanf("%d",&a[i]);sort(a,a+n);
for(int i=;i<m;i++)scanf("%d",&b[i]);sort(b,b+m);
long long l=a[]*b[];
long long r=a[n-]*b[m-];
long long ans;
while(l<=r)
{
long long mid=(r+l)/;
int sum=judge(mid);
if(sum>=k)
ans=mid,l=mid+;
else
r=mid-;
}
printf("%lld\n",ans);
out:;
}
return ;
}

zcmu 1540第k大数的更多相关文章

  1. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  2. 杨氏矩阵:查找x是否在矩阵中,第K大数

    参考:http://xudacheng06.blog.163.com/blog/static/4894143320127891610158/ 杨氏矩阵(Young Tableau)是一个很奇妙的数据结 ...

  3. 区间K 大数查询

      算法训练 区间k大数查询   时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列 ...

  4. 快速查找无序数组中的第K大数?

    1.题目分析: 查找无序数组中的第K大数,直观感觉便是先排好序再找到下标为K-1的元素,时间复杂度O(NlgN).在此,我们想探索是否存在时间复杂度 < O(NlgN),而且近似等于O(N)的高 ...

  5. 两个有序数组中查找第K大数

    题目:两个数组A.B,长度分别为m.n,即A(m).B(n),分别是递增数组.求第K大的数字.   方法一: 简单的办法,使用Merge Sort,首先将两个数组合并,然后在枚举查找.这个算法的时间复 ...

  6. 蓝桥杯 算法训练 区间k大数查询(水题)

    算法训练 区间k大数查询 时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. ...

  7. 算法训练 区间k大数查询

    http://lx.lanqiao.org/problem.page?gpid=T11 算法训练 区间k大数查询   时间限制:1.0s   内存限制:256.0MB        问题描述 给定一个 ...

  8. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

  9. 蓝桥杯--算法训练 区间k大数查询

                                                                                 算法训练 区间k大数查询   时间限制:1.0 ...

随机推荐

  1. 论文阅读 | Recurrent Attentional Reinforcement Learning for Multi-label Image Recognition

    源地址 arXiv:1712.07465: Recurrent Attentional Reinforcement Learning for Multi-label Image Recognition ...

  2. java.lang.IllegalArgumentException: host parameter is null

    即 URL 应为 http://www.baidu.com  但是实际配置成了  www.baidu.com 所以出现此错误

  3. MySQL索引原理(二)

    MySQL索引原理 1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引,会保存在额外的文件中.索引是数据库中专门用于帮助用户快速查询数据的一种数据结构. ...

  4. SqlComparison

    package com.ufo.leftjoin; import java.security.MessageDigest; import java.sql.Connection; import jav ...

  5. linux查找历史命令

    1.ctr+r  输入搜索关键词 2.&history 3.上箭头翻看

  6. 累积分布函数(cumulative distribution function)

    sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程,QQ:231469242) https://study.163.com/course/introduction.htm?courseId ...

  7. Ubuntu下卸载anaconda

    转载:https://blog.csdn.net/m0_37407756/article/details/77968724(一)删除整个anaconda目录: 由于Anaconda的安装文件都包含在一 ...

  8. 【Git】PHP项目自动化部署的注意事项

    直接开始 1 服务器克隆项目 git clone git@*****.com/project.git 2 更改所有者 chown www:www /www/wwwroot/project/* -R 3 ...

  9. Docker使用 - 镜像

    获取镜像 命令:docker  pull  [选项]  镜像名 可通过 ”docker  pull  --help“  命令来查看有哪些选项 docker pull training/webapp # ...

  10. 深入浅出依赖注入容器——Autofac

    1.写在前面 相信大家对IOC和DI都耳熟能详,它们在项目里面带来的便利大家也都知道,微软新出的.NetCore也大量采用了这种手法. 如今.NetCore也是大势所趋了,基本上以.Net为技术主导的 ...