题目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 ...
随机推荐
- web API help pages with Swagger / OpenAPI
https://docs.microsoft.com/en-us/aspnet/core/tutorials/web-api-help-pages-using-swagger?view=aspnetc ...
- php数组元素去空,测试奇数偶数
<?php//返回奇数 function test_odd($var) { return($var & 1); } $a1=array("a","b&quo ...
- DPDK l3fwd
l3fwd负责三层转发,比l2fwd要复杂点. /*- * BSD LICENSE * * Copyright(c) 2010-2014 Intel Corporation. All rights r ...
- 记一次Configured Capacity: 0 (0 B)的解决
场景 最近hadoop集群新加了一个节点N,通过Ambari管理 一切正常. 过了两天发现,虽然集群每天要进几个G的数据(共8个节点),但节点N占用空间丝毫没有变化,显然没有进数据啊 日志 查看该节点 ...
- KNN 算法,以及与Kmeans的简单对比
KNN与Kmeans感觉没啥联系,但是名字挺像的,就拿来一起总结一下吧. 初学者的总结. KNN是监督学习,Kmeans是无监督学习. KNN用于分类,Kmeans用于聚类. 先说KNN: 对于KNN ...
- C++中GB2312字符串和UTF-8之间的转换
在编程过程中需要对字符串进行不同的转换,特别是Gb2312和Utf-8直接的转换.在几个开源的魔兽私服中,很多都是老外开发的,而暴雪为了能 够兼容世界上的各个字符集也使用了UTF-8.在中国使用VS( ...
- 解决Oracle数据库IP地址改变创建数据库的问题
方案一 查了相关的资料后才知道,只要修改安装Oracle的目录下面的listener.ora和tnsnames.ora里面的内容即可.看图看图 修改什么内容呢?看图看图. 就是HOST地址改一下就可 ...
- 简短的perl程序
简短的perl程序能够实现大功能. perl是如何做到的呢? 1. 默认变量 如果没有向函数提供参数值,则默认参数为$_: 如果没有变量用于接收一个表达式的值,则默认接收变量为 ...
- docker的应用
[root@yz6205 ~]# docker imagesINFO[0063] GET /v1.19/images/json REPOSITORY TAG IMAGE ID CREATED VIRT ...
- 《The Cg Tutorial》阅读笔记——环境贴图 Environment Mapping
本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4969956.html 环境贴图 Environment Mapping 一.简介 环 ...