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小的数字 ——二分的更多相关文章

  1. 九度OJ 1534 数组中第K小的数字 -- 二分查找

    题目地址:http://ac.jobdu.com/problem.php?pid=1534 题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C. 譬如A为[1,2],B为[ ...

  2. 数组中第K小的数字(Google面试题)

    http://ac.jobdu.com/problem.php?pid=1534 题目1534:数组中第K小的数字 时间限制:2 秒 内存限制:128 兆 特殊判题:否 提交:1120 解决:208 ...

  3. 九度OJ 题目1534:数组中第K小的数字(二分解)

    题目链接:点击打开链接 题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C. 譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6 ...

  4. 九度oj 题目1534:数组中第K小的数字

    题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C. 譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6]. 现在给你数组A和B ...

  5. 九度 1534:数组中第K小的数字(二分法变形)

    题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C.譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6].现在给你数组A和B,求 ...

  6. #7 找出数组中第k小的数

    「HW面试题」 [题目] 给定一个整数数组,如何快速地求出该数组中第k小的数.假如数组为[4,0,1,0,2,3],那么第三小的元素是1 [题目分析] 这道题涉及整数列表排序问题,直接使用sort方法 ...

  7. 选择问题(选择数组中第K小的数)

    由排序问题可以引申出选择问题,选择问题就是选择并返回数组中第k小的数,如果把数组全部排好序,在返回第k小的数,也能正确返回,但是这无疑做了很多无用功,由上篇博客中提到的快速排序,稍稍修改下就可以以较小 ...

  8. [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 ...

  9. [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 ...

随机推荐

  1. centos7下apache+tomcat整合

    前提 在系统中已经安装好了jdk.tomcat.apache #本人博客中jdk安装连接 http://www.cnblogs.com/xhkj/p/6545111.html #本人博客中tomcat ...

  2. 超详细 Linux 下编译安装Redis 以及php配套使用

    一.Linux 下安装Redis 下载地址:http://redis.io/download,下载最新文档版本. 把鼠标移到上图的绿色框上,就会显示下图提示:(直接右键复制链接就好) 本教程使用的旧版 ...

  3. how to create an asp.net web api project in visual studio 2017

    https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/tutoria ...

  4. SQLServer行列转换PIVOT函数中聚合函数的使用意义及选择

    例子:https://blog.csdn.net/wikey_zhang/article/details/76849826 DECLARE @limitDay INT;SET @limitDay = ...

  5. CodeChef FORESTGA 二分

    Forest Gathering   Problem code: FORESTGA Tweet     ALL SUBMISSIONS All submissions for this problem ...

  6. RabbitMQ 简单了解以及使用

    RabbitMQ 开发语言:Erlang – 面向并发的编程语言. AMQP:是消息队列的一个协议. mysql 是 java 写的吗?不是 那么 java 能不能访问?可以,则通过(驱动)协议;那么 ...

  7. HttpClient示例01

    1.要使用 HttpClient 需要下载 Apache的相关包 我这里下载的是 httpcomponents-client-4.5.2-bin.zip.httpcomponents-client-4 ...

  8. JNI_Z_09_Java的字符串

    ZC: jstring 就是 Java中的String对象 ZC: 10.8 Unicode字符串结尾(http://www.360doc.cn/article/14233282_321497569. ...

  9. vue开发者工具DejaVue

    刚刚在逛github的时候发现了一个vue开发工具觉得很不错,分享给v友们! 地址:https://github.com/MiCottOn/DejaVue 话不多说,直接说操作流程!(前提是node版 ...

  10. flask学习(一):环境的安装

    一. 安装python2.7 从python官网下载python2.7的版本 双击python2.7,然后选择安装路径,一直下一步就可以了 设置环境变量,把python和pip的安装路径添加到PATH ...