1105 第K大的数 
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题

 收藏
 关注

数组A和数组B,里面都有n个整数。数组C共有n^2个整数,分别是A[0] * B[0],A[0] * B[1] ......A[1] * B[0],A[1] * B[1]......A[n - 1] * B[n - 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个数,分别是A[i]和B[i]。(1 <= A[i],B[i] <= 10^9)
Output
输出第K大的数。
Input示例
3 2
1 2
2 3
3 4
Output示例
9

【代码】:

#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
#include<cmath>
#include<cctype>
using namespace std;
#define LL long long
#define fin freopen("input.txt","r",stdin)
#define fout freopen("output.txt","w+",stdout)
const int INF = 0x3f3f3f3f;
const int N = 50005;
const int M = 100005;
LL n,m,k,mid;
/*数组A同数组B组合乘积,二分查找第K大*/
LL a[N], b[N];
//二分答案
/*
先把a和b排序,
然后确定当前二分的数所在的范围(即是由a中的哪个数组成的)
然后再二分b中匹配的位置,然后每次用n减去
就是小于当前二分数的数字的数量首先我们枚举一个数组,然后二分另一个数组,
找到 >= x的数目,其实我们就是二分答案,
l = a[0]*b[0], r = a[n-1]*b[n-1] 如果 >=mid的数目
*/
int ok(LL x)
{LL sum = 0, tp;for(LL i=0; i<n; i++){ //枚举a数组,二分b数组tp = x/a[i]+1;sum  += n - (lower_bound(b, b+n,tp) - b);}return sum;
}
//二分查找int main()
{while(cin >> n >> k){for(int i=0; i<n; i++)cin >> a[i] >> b[i];sort(a,a+n);sort(b,b+n);LL l = a[0]*b[0] , r = a[n-1]*b[n-1];while(l <= r){mid = (l + r) >> 1;if(ok(mid) >= k)  l = mid + 1;else r = mid - 1;}cout << l << endl;}
}

注释

转载于:https://www.cnblogs.com/Roni-i/p/8871246.html

51nod 1105 第K大的数 【双重二分/二分套二分/两数组任意乘积后第K大数】相关推荐

  1. 面试官:海量无序数据,寻找第 K 大的数,越快越好

    最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门: https://tianchi.aliyun.com/competition/entra ...

  2. 海量无序数据寻找第 K 大的数

    前言 最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门:https://tianchi.aliyun.com/competition/ent ...

  3. OpenJudge计算概论-找出第k大的数

    /*================================================ 找出第k大的数 总时间限制: 1000ms 内存限制: 1000kB 描述 用户输入N和K,然后接 ...

  4. 在递归中使用Continuation来避免StackOverflow(查找第K大的数)

    前段时间从涛哥那学了一招--在递归里面使用Continuation 来避免大量的局部变量的使用,从而避免StackOverflow. 下面是一个小的例子:查找整数数组中的第K大的数: 在递归中使用Co ...

  5. 寻找数组中第k大的数

    题目:有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2 ...

  6. C++——寻找第k大的数

    给出一个数组,找出数组的第k大的数:基于快速排序的思路,每次快排后,基准的左边都是比其小的数,右边都是比其大的数,一次快排结束后,若基准所处的位置正好是第k大(即基准右边有k-1个数据),则返回基准值 ...

  7. 快速排序与查找第K大的数

    快速排序与查找第K大的数 今天种树的任务是复习一下快排,顺便实现了一下查找第K大的数的算法. 快速排序 非常常见也非常经典的算法,随便给你们找一篇. https://www.cnblogs.com/a ...

  8. 快速排序 寻找第K大的数

    对于海量不确定数据,可采用维护大小为K的最小堆不断更新前K大的数 但对于数量有限的数组,可采用快速排序的思想寻找第K大的数,时间复杂度为O(lgN) 即快排之后, 若K刚好为基准点下标,那么返回基准点 ...

  9. 两个排序数组中找第k大的数

    一.题目描述 给定两个已经排序好的数组,找到两者所有元素中第k大的元素 二.解法分析 解法一:参照归并排序 将两个有序数组变成一个有序数组:merge两个数组,然后求第k大的数,时间复杂度O(m+n) ...

  10. 51nod 1105:第K大的数

    1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * ...

最新文章

  1. IDEA Java解析GeoJson.json文件
  2. Only tensors or tuples of tensors can be output from traced functions
  3. HTML基础(四):注释、URL参数、访问路径、图片地图
  4. 2021努力拼搏,致敬为梦想而拼搏的人
  5. 【Linux】一步一步学Linux——declare命令(217)
  6. re.containerbase.startinternal 子容器启动失败_Python项目容器化实践(二) Docker Machine和Docker Swarm...
  7. [译] 使用 iPhone X 与 Maya 实现快速面部捕捉
  8. IPython在Windows 7上的搭建步骤
  9. kafka创建Topic的一道面试题
  10. JavaScript:get和post的区别
  11. linux内核源码阅读之facebook硬盘加速flashcache之二
  12. 在ThinkPHP5.0打造一个专属短信接口
  13. 【转】用 Go 构建一个区块链
  14. How to set edit and display rights for users by each feld or view of the list
  15. 全国计算机二级很难得吗,全国计算机二级考试难吗?
  16. 实实在在,伴您同行丨实在“华夏行”第四站成渝站圆满举办!
  17. ASP.NET中的KRE是什么?
  18. java期末心得,java期末小结
  19. IDEA 打不开,双击无反应,IDEA 2021.3
  20. 强力删除在C盘中流氓软件文件的方法

热门文章

  1. offset Dimensions 详解
  2. 澜舟科技开源轻量级中文语言预训练模型——孟子模型
  3. 数据预处理—8.属性归约之主成分分析(理论及python实现)
  4. 数据预处理—2.为什么Lasso回归可以做特征选择(变量挑选)而岭回归做不到呢?
  5. 金融评分卡项目—2.银行客户流失预警模型介绍(单因子与多因子分析)
  6. 统计学习方法读书笔记6-K近邻算法及代码实现
  7. 深度学习14-实战三-Google涂鸦识别挑战项目(上)
  8. 人工智能数学基础之线性代数(持续更新)
  9. NFC:Arduino、Android与PhoneGap近场通信
  10. 《Node.js实战(双色)》作者之一——吴中骅访谈录