题目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 ...
随机推荐
- eclipse——反编译插件
百度云链接 链接:https://pan.baidu.com/s/1iEtstiK5mJ4kDp6gTfVBww 密码:8wf7 在线安装地址 http://jd.benow.ca/jd-eclips ...
- hdu1596 find the safest road - floyd
2017-08-04 14:42:56 writer:pprp 题意: Problem Description XX星球有很多城市,每个城市之间有一条或多条飞行通道,但是并不是所有的路都是很安全的,每 ...
- java 多继承的典型应用实例(不同的报文不同的方法去解析)
关于 java 多继承的典型应用实例 针对不同业务类型的XML文件的解析 在PCS 项目: public class CainiaoXMLMessageResolverServiceImpl impl ...
- Nginx配置端口访问的网站
server { listen 80; #listen [::]:80 default_server ipv6only=on; server_name www.website.com; index i ...
- neutron dhcp ha 实验
4个节点(controller, network,2 compute nodes) 1.0 on the network node 1.1 set –I ‘s/start] on/#start\ ...
- LeetCode第[15]题(Java):3Sum (三数之和为目标值)——Medium
题目难度:Medium 题目: Given an array S of n integers, are there elements a, b, c in S such that a + b + c ...
- JS获取元素计算过后的样式
获取元素计算过后的样式 Window.getComputedStyle() 方法会在一个元素应用完有效样式且计算完所有属性的基本值之后给出所有 CSS 属性的值. 语法: let style = wi ...
- Ajax-04 jQuery Ajax 常用操作
jQuery jQuery 其实就是一个JavaScript的类库,其将复杂的功能做了上层封装,使得开发者可以在其基础上写更少的代码实现更多的功能. jQuery Ajax a.概述 jQuery 不 ...
- Windows Server 2016 桌面环境的自动配置脚本(2017-10-24更新)
github:https://github.com/m2nlight/WindowsServerToWindowsDesktop 下载:https://github.com/m2nlight/Wind ...
- IOS-SDWebImage根据网络状态加载图片
iOS开发-你真的会用SDWebImage? 2016-05-17 hosea_zhou 有意思啊 原创作者:hosea_zhou 原文地址:http://www.jianshu.com/p/dabc ...