题目1534:数组中第K小的数字 ——二分
http://ac.jobdu.com/problem.php?pid=1534
给定两个整型数组A和B。我们将A和B中的元素两两相加可以得到数组C。
譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6]。
现在给你数组A和B,求由A和B两两相加得到的数组C中,第K小的数字。
对于每个测试案例,输入的第一行为三个整数m,n, k(1<=m,n<=100000, 1<= k <= n *m):n,m代表将要输入数组A和B的长度。
显然直接枚举K的话时间复杂度为O(n*m)
考虑用二分的方法
在 [a[1]+b[1],a[n]+b[m]]的区间二分枚举答案k , 时间复杂度log(10^9)
而在cal函数 则也要用二分查找的方式计算 小于等于k的数字个数有几个 n*log(m)
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std; long long a[];
long long b[];
long long n,m; long long cmp(long long a,long long b){
return a<b;
} long long cal(long long v){
long long ll,rr,mid,i,add=; long long min,max;
for(i=;i<=n;i++){
min=a[i]+b[];
max=a[i]+b[m];
if(v<min){
break;
}
if(v>=max){
add+=m;continue;
} ll=,rr=m;
while(ll<=rr){
mid=(ll+rr)/;
if(v<(a[i]+b[mid])) rr=mid-;
else ll=mid+;
}
if(v!=(a[i]+b[ll]))ll--;
add+=ll;
} return add;
} long long find(long long ll,long long rr,long long k){
long long mid,i;
while(ll<=rr){
mid=(ll+rr)/;
if(k<=cal(mid)) rr=mid-;
else ll=mid+;
} return ll;
} int main()
{
long long k,ll,rr;
while(scanf("%lld%lld%lld",&n,&m,&k)!=EOF){
long long i; for(i=;i<=n;i++){
scanf("%lld",&a[i]);
}sort(&a[],&a[n+],cmp); for(i=;i<=m;i++){
scanf("%lld",&b[i]);
}sort(&b[],&b[+m],cmp); ll=a[]+b[];
rr=a[n]+b[m]; printf("%lld\n",find(ll,rr,k));
} return ;
}
而cal函数也可以用贪心的方法计算 (n+m)
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std; long long a[];
long long b[];
long long n,m; long long cmp(long long a,long long b){
return a<b;
} long long cal(long long v){
long long ll,rr,mid,i,add=; long long min,max,j=m;
for(i=;i<=n;i++){
while(j>=&&(a[i]+b[j])>v)j--;
if(j==)break; add+=j;
} return add;
} long long find(long long ll,long long rr,long long k){
long long mid,i;
while(ll<=rr){
mid=(ll+rr)/;
if(k<=cal(mid)) rr=mid-;
else ll=mid+;
} return ll;
} int main()
{
long long k,ll,rr;
while(scanf("%lld%lld%lld",&n,&m,&k)!=EOF){
long long i; for(i=;i<=n;i++){
scanf("%lld",&a[i]);
}sort(&a[],&a[n+],cmp); for(i=;i<=m;i++){
scanf("%lld",&b[i]);
}sort(&b[],&b[+m],cmp); ll=a[]+b[];
rr=a[n]+b[m]; printf("%lld\n",find(ll,rr,k));
} return ;
}
题目1534:数组中第K小的数字 ——二分的更多相关文章
- 九度OJ 1534 数组中第K小的数字 -- 二分查找
题目地址:http://ac.jobdu.com/problem.php?pid=1534 题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C. 譬如A为[1,2],B为[ ...
- 数组中第K小的数字(Google面试题)
http://ac.jobdu.com/problem.php?pid=1534 题目1534:数组中第K小的数字 时间限制:2 秒 内存限制:128 兆 特殊判题:否 提交:1120 解决:208 ...
- 九度OJ 题目1534:数组中第K小的数字(二分解)
题目链接:点击打开链接 题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C. 譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6 ...
- 九度oj 题目1534:数组中第K小的数字
题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C. 譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6]. 现在给你数组A和B ...
- 九度 1534:数组中第K小的数字(二分法变形)
题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C.譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6].现在给你数组A和B,求 ...
- #7 找出数组中第k小的数
「HW面试题」 [题目] 给定一个整数数组,如何快速地求出该数组中第k小的数.假如数组为[4,0,1,0,2,3],那么第三小的元素是1 [题目分析] 这道题涉及整数列表排序问题,直接使用sort方法 ...
- 选择问题(选择数组中第K小的数)
由排序问题可以引申出选择问题,选择问题就是选择并返回数组中第k小的数,如果把数组全部排好序,在返回第k小的数,也能正确返回,但是这无疑做了很多无用功,由上篇博客中提到的快速排序,稍稍修改下就可以以较小 ...
- [LeetCode] Kth Largest Element in an Array 数组中第k大的数字
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...
- [LeetCode] 215. Kth Largest Element in an Array 数组中第k大的数字
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...
随机推荐
- Hardware Prefetcher
硬件预取选项,指CPU有硬件预取功能,在CPU处理指令或数据之前,它将这些指令或数据从内存预取到L2缓存中,借此减少内存读取的时间,帮助消除潜在的瓶颈,以此提高系统效能.通常情况下建议设置为Enabl ...
- 对拷 使用scp命令在两台linux上对拷文件或者文件夹
以前一直是在服务器上tar打包压缩,下载到本地电脑上,再上传到另外一台服务器上,再解压. 其实使用scp命令就可以直接对拷文件或者文件夹了. scp就是secure copy,是用来进行远程文件拷贝的 ...
- LeetCode第[17]题(Java):Letter Combinations of a Phone Number
题目:最长公共前缀 难度:EASY 题目内容: Given a string containing digits from 2-9 inclusive, return all possible let ...
- spring3: 延迟初始化Bean
3.3.1 延迟初始化Bean 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean. 配置方式很简单只需在<bean>标签上指定 “lazy- ...
- WPF中的事件列表 .
以下是WPF中的常见事件汇总表(按字母排序),翻译不见得准确,但希望对你有用. 事件 描述 Annotation.AnchorChanged 新增.移除或修改 Anchor 元素时发生. Annota ...
- CSS自定义字体(@font-face选择符)
@font-face是CSS中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体. 语法规则: @f ...
- PL/SQL通过修改配置文件的方式实现数据库的连接
http://jingyan.baidu.com/article/c74d600080632a0f6a595d80.html
- os.path.abs()与os.path.realpath()的一点区别
相同点 1. 两者都是返回绝对路径,如果参数path为空,则返回当前文件所在目录的绝对路径 当前py文件所在的目录是revise print(os.path.abspath("") ...
- 【sparkSQL】创建DataFrame及保存
首先我们要创建SparkSession val spark = SparkSession.builder() .appName("test") .master("loca ...
- JavaScript中url 传递参数(特殊字符)解决方法及转码解码的介绍
有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.下表中列出了一些URL特殊符号及编码 十六进制值 1. + URL 中+号表示空格 %2B 2. 空 ...