51nod 1105 第K大的数 【双重二分/二分套二分/两数组任意乘积后第K大数】
第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)
输出第K大的数。
3 2 1 2 2 3 3 4
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大数】相关推荐
- 面试官:海量无序数据,寻找第 K 大的数,越快越好
最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门: https://tianchi.aliyun.com/competition/entra ...
- 海量无序数据寻找第 K 大的数
前言 最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门:https://tianchi.aliyun.com/competition/ent ...
- OpenJudge计算概论-找出第k大的数
/*================================================ 找出第k大的数 总时间限制: 1000ms 内存限制: 1000kB 描述 用户输入N和K,然后接 ...
- 在递归中使用Continuation来避免StackOverflow(查找第K大的数)
前段时间从涛哥那学了一招--在递归里面使用Continuation 来避免大量的局部变量的使用,从而避免StackOverflow. 下面是一个小的例子:查找整数数组中的第K大的数: 在递归中使用Co ...
- 寻找数组中第k大的数
题目:有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2 ...
- C++——寻找第k大的数
给出一个数组,找出数组的第k大的数:基于快速排序的思路,每次快排后,基准的左边都是比其小的数,右边都是比其大的数,一次快排结束后,若基准所处的位置正好是第k大(即基准右边有k-1个数据),则返回基准值 ...
- 快速排序与查找第K大的数
快速排序与查找第K大的数 今天种树的任务是复习一下快排,顺便实现了一下查找第K大的数的算法. 快速排序 非常常见也非常经典的算法,随便给你们找一篇. https://www.cnblogs.com/a ...
- 快速排序 寻找第K大的数
对于海量不确定数据,可采用维护大小为K的最小堆不断更新前K大的数 但对于数量有限的数组,可采用快速排序的思想寻找第K大的数,时间复杂度为O(lgN) 即快排之后, 若K刚好为基准点下标,那么返回基准点 ...
- 两个排序数组中找第k大的数
一.题目描述 给定两个已经排序好的数组,找到两者所有元素中第k大的元素 二.解法分析 解法一:参照归并排序 将两个有序数组变成一个有序数组:merge两个数组,然后求第k大的数,时间复杂度O(m+n) ...
- 51nod 1105:第K大的数
1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * ...
最新文章
- IDEA Java解析GeoJson.json文件
- Only tensors or tuples of tensors can be output from traced functions
- HTML基础(四):注释、URL参数、访问路径、图片地图
- 2021努力拼搏,致敬为梦想而拼搏的人
- 【Linux】一步一步学Linux——declare命令(217)
- re.containerbase.startinternal 子容器启动失败_Python项目容器化实践(二) Docker Machine和Docker Swarm...
- [译] 使用 iPhone X 与 Maya 实现快速面部捕捉
- IPython在Windows 7上的搭建步骤
- kafka创建Topic的一道面试题
- JavaScript:get和post的区别
- linux内核源码阅读之facebook硬盘加速flashcache之二
- 在ThinkPHP5.0打造一个专属短信接口
- 【转】用 Go 构建一个区块链
- How to set edit and display rights for users by each feld or view of the list
- 全国计算机二级很难得吗,全国计算机二级考试难吗?
- 实实在在,伴您同行丨实在“华夏行”第四站成渝站圆满举办!
- ASP.NET中的KRE是什么?
- java期末心得,java期末小结
- IDEA 打不开,双击无反应,IDEA 2021.3
- 强力删除在C盘中流氓软件文件的方法
热门文章
- offset Dimensions 详解
- 澜舟科技开源轻量级中文语言预训练模型——孟子模型
- 数据预处理—8.属性归约之主成分分析(理论及python实现)
- 数据预处理—2.为什么Lasso回归可以做特征选择(变量挑选)而岭回归做不到呢?
- 金融评分卡项目—2.银行客户流失预警模型介绍(单因子与多因子分析)
- 统计学习方法读书笔记6-K近邻算法及代码实现
- 深度学习14-实战三-Google涂鸦识别挑战项目(上)
- 人工智能数学基础之线性代数(持续更新)
- NFC:Arduino、Android与PhoneGap近场通信
- 《Node.js实战(双色)》作者之一——吴中骅访谈录