1540: 第k大数

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 665  Solved: 98
[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

HINT

Source

首届全国中医药院校大学生程序设计竞赛

解析:不可能每个数去相乘然后排序。所有我们可以去二分查找。这里二分查找不是很好想到的。二分枚举一个数,求大于它的数有几个,若>k,说明值在大的地方,也就是右边,l=mid+1;反之亦然。这里还有一个地方,就是求大于二分枚举数的值有几个。我们可以贪心一下,排序。则l=a[0]*b[0],  r=a[n-1]*b[m-1]。a从后往前,b从前往后。具体看代码f()函数

#include<bits/stdc++.h>
using namespace std;#define e exp(1)
#define pi acos(-1)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#define mem(a,b) memset(a,b,sizeof(a))
int gcd(int a,int b){return b?gcd(b,a%b):a;}int n,m,k;
const int maxn=100005;
ll a[maxn],b[maxn];ll f(ll x)
{ll cnt=0;int j=0;for(int i=n-1; i>=0; --i){for(; j<m; ++j){if(a[i]*b[j]>=x){cnt+=(m-j);break;}}}return cnt;
}
int main()
{int T;scanf("%d",&T);while(T--){scanf("%d%d%d",&n,&m,&k);for(int i=0; i<n; i++)scanf("%lld",&a[i]);for(int i=0; i<m; i++)scanf("%lld",&b[i]);sort(a,a+n);sort(b,b+m);ll l=a[0]*b[0];ll r=a[n-1]*b[m-1];ll ans=0;while(l<=r){ll mid=l+r>>1;ll p=f(mid);if(p>=k)l=mid+1,ans=mid;else if(p<k)r=mid-1;}printf("%lld\n",ans);}return 0;
} 

zcmu1540(二分)相关推荐

  1. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  2. 分治算法的设计思想(二分检索、二分归并排序)

    分治策略思想: 将原问题划分或者归结为规模较小的子问题. 递归或迭代求解每一个问题. 将子问题的解综合得到原问题的解. 性质: 子问题与原问题具有相同的性质. 子问题的求解彼此独立. 划分时子问题的规 ...

  3. LeetCode简单题之二分查找

    题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: n ...

  4. 二分查找模板全面总结

    二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...

  5. [C] [二分] C语言实现快速排序

    为了以防万一有人想不开想手撕快排呢?比如我. 通过快排来理解二分思想 什么是快排? 快排的思想不难,理解好递归很重要. 什么是递归? 递归,就是在运行的过程中调用自己. 构成递归需具备的条件: 子问题 ...

  6. Showstopper [POJ3484] [二分] [思维]

    Description 给你n个数列,问哪一个数字在所有的数列中出现了奇数次(最多一个). Sample Input 1 10 1 2 10 11 10 1 1 10 11 10 1 4 4 1 1 ...

  7. BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】

    题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...

  8. usaco The Perfect Stall(二分匹配模板)

    其实二分匹配都是很早之前看的不过又忘了现在再看看比第一次好理解多了. /* ID:jinbo wu TASK:stall4 LANG:C++ */ #include<bits/stdc++.h& ...

  9. php二分搜索,php如何实现二分搜索法

    在php中实现二分搜索法的方法:首先,取数组中的一个值作为边界:然后递归搜索直到最后,代码是[if ($ low 本教程的操作环境:windows7系统,PHP 5.6版,DELL G3电脑.此方法适 ...

最新文章

  1. 十个最适合 Web 和 APP 开发的 NodeJS 框架
  2. Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
  3. 谷歌浏览器外贸版_针对谷歌SEO,你有哪些值得推荐的工具、插件、网站、app,或者技巧分享?...
  4. oracle数据库并行数限制,Oracle数据库并行处理技术详解(上)
  5. 内推 | 旷视研究院深度学习实习生招聘(含内推邮箱)
  6. re模块常用修饰符_在c语言中修饰符的用法
  7. android 无线接口 泛收,Android下的Java之interface接口泛型 动态获取泛型的类型
  8. Dubbo注册中心-监控中心安装笔记(CentOS7)
  9. 系统学习深度学习(十四)--权重初始化Xavier
  10. plm系统服务器,PLM产品全生命周期管理 - 产品数据服务系统
  11. matlab研究锂电池,基于MATLAB的锂电池健康状态建模实现
  12. linux cp -r 参数,Linux cp命令参数简介
  13. C语言简单实现14个例题(谭浩强第四版)
  14. 2021-09-07 PostMan API请求错误
  15. 绝望爱の歌---最终兵器彼女
  16. 学习博士答辩之后的感想:
  17. Java 海康SDK透明通道建立(485透传)
  18. KubeSphere DevOps流水线部署
  19. listen的backlog值分析
  20. docker镜像的分层理解,大白话跟你讲

热门文章

  1. 显示二维数组并计算和
  2. USBASP的ISP上位机软件AVR_fighter
  3. 转:求多边形的面积 算法几何
  4. 常用chrome插件
  5. Google 联合 Plaxo 对 OpenID 进行改进
  6. Python进阶_wxpy学习:用微信监控你的程序
  7. R学习_multitaper包解析1:子函数centre,dpss
  8. 【14】全歌王歌后合集
  9. 利用阿里云自定义镜像实现服务器数据/网站快速迁移
  10. 吴恩达《Machine Learning》精炼笔记 4:神经网络基础