题目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 ...
随机推荐
- fabric动态获取远程目录列表
#!/usr/bin/pythonfrom fabric.api import *env.user='root'env.hosts=['172.10.224.183','172.10.224.132' ...
- DCU IP Prefether
DCU IP Prefether 数据高速缓存单元预取I P 设置.如果设置为E n a b l e d,会预取I P 地址以改善网络连接和系统性能,所以建议选择E n a b l ed.选项:E n ...
- LeetCode第[11]题(Java):Container With Most Water (数组容器盛水)——Medium
题目难度:Medium Given n non-negative integers a1, a2, ..., an, where each represents a point at coordina ...
- 读jQuery之六(缓存数据)
很多同学在项目中都喜欢将数据存储在HTMLElement属性上,如 1 2 3 4 <div data="some data">Test</div> < ...
- 利用$http获取在服务器的json数据
以下是存储在web服务器上的 JSON 文件: http://www.runoob.com/try/angularjs/data/Customers_JSON.php { "records& ...
- UnsupportedOperationException
java不支持该功能,多见于, Arrays.asList() ,然后使用remove和add方法. 因为asarraylist的集合是一个转化来的集合,它的大小是固定的.不能进行长度修改. ...
- IOS-将任意对象存进数据库
model // // HMShop.h // 将任意对象存进数据库 // // Created by apple on 14/11/20. // Copyright (c) 2014年 heima. ...
- 2017.10.26 ECN + product spec+ cypress ble module test+
1 ECN Ecn should be issued when modifying drawing,Copy children BOM of subassembly from BIL if one ...
- Leetcode 589. N-ary Tree Preorder Traversal
DFS,两种实现方式,递归和栈. """ # Definition for a Node. class Node: def __init__(self, val, chi ...
- 正则化项L1和L2的区别
https://blog.csdn.net/jinping_shi/article/details/52433975 https://blog.csdn.net/zouxy09/article/det ...