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)

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<algorithm>
  4. using namespace std;
  5.  
  6. long long a[];
  7. long long b[];
  8. long long n,m;
  9.  
  10. long long cmp(long long a,long long b){
  11. return a<b;
  12. }
  13.  
  14. long long cal(long long v){
  15. long long ll,rr,mid,i,add=;
  16.  
  17. long long min,max;
  18. for(i=;i<=n;i++){
  19. min=a[i]+b[];
  20. max=a[i]+b[m];
  21. if(v<min){
  22. break;
  23. }
  24. if(v>=max){
  25. add+=m;continue;
  26. }
  27.  
  28. ll=,rr=m;
  29. while(ll<=rr){
  30. mid=(ll+rr)/;
  31. if(v<(a[i]+b[mid])) rr=mid-;
  32. else ll=mid+;
  33. }
  34. if(v!=(a[i]+b[ll]))ll--;
  35. add+=ll;
  36. }
  37.  
  38. return add;
  39. }
  40.  
  41. long long find(long long ll,long long rr,long long k){
  42. long long mid,i;
  43. while(ll<=rr){
  44. mid=(ll+rr)/;
  45. if(k<=cal(mid)) rr=mid-;
  46. else ll=mid+;
  47. }
  48.  
  49. return ll;
  50. }
  51.  
  52. int main()
  53. {
  54. long long k,ll,rr;
  55. while(scanf("%lld%lld%lld",&n,&m,&k)!=EOF){
  56. long long i;
  57.  
  58. for(i=;i<=n;i++){
  59. scanf("%lld",&a[i]);
  60. }sort(&a[],&a[n+],cmp);
  61.  
  62. for(i=;i<=m;i++){
  63. scanf("%lld",&b[i]);
  64. }sort(&b[],&b[+m],cmp);
  65.  
  66. ll=a[]+b[];
  67. rr=a[n]+b[m];
  68.  
  69. printf("%lld\n",find(ll,rr,k));
  70. }
  71.  
  72. return ;
  73. }

而cal函数也可以用贪心的方法计算 (n+m)

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<algorithm>
  4. using namespace std;
  5.  
  6. long long a[];
  7. long long b[];
  8. long long n,m;
  9.  
  10. long long cmp(long long a,long long b){
  11. return a<b;
  12. }
  13.  
  14. long long cal(long long v){
  15. long long ll,rr,mid,i,add=;
  16.  
  17. long long min,max,j=m;
  18. for(i=;i<=n;i++){
  19. while(j>=&&(a[i]+b[j])>v)j--;
  20. if(j==)break;
  21.  
  22. add+=j;
  23. }
  24.  
  25. return add;
  26. }
  27.  
  28. long long find(long long ll,long long rr,long long k){
  29. long long mid,i;
  30. while(ll<=rr){
  31. mid=(ll+rr)/;
  32. if(k<=cal(mid)) rr=mid-;
  33. else ll=mid+;
  34. }
  35.  
  36. return ll;
  37. }
  38.  
  39. int main()
  40. {
  41. long long k,ll,rr;
  42. while(scanf("%lld%lld%lld",&n,&m,&k)!=EOF){
  43. long long i;
  44.  
  45. for(i=;i<=n;i++){
  46. scanf("%lld",&a[i]);
  47. }sort(&a[],&a[n+],cmp);
  48.  
  49. for(i=;i<=m;i++){
  50. scanf("%lld",&b[i]);
  51. }sort(&b[],&b[+m],cmp);
  52.  
  53. ll=a[]+b[];
  54. rr=a[n]+b[m];
  55.  
  56. printf("%lld\n",find(ll,rr,k));
  57. }
  58.  
  59. return ;
  60. }

题目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. SpringBoot和Mycat动态数据源项目整合

    SpringBoot项目整合动态数据源(读写分离) 1.配置多个数据源,根据业务需求访问不同的数据,指定对应的策略:增加,删除,修改操作访问对应数据,查询访问对应数据,不同数据库做好的数据一致性的处理 ...

  2. AtCoder Regular Contest 097

    AtCoder Regular Contest 097 C - K-th Substring 题意: 求一个长度小于等于5000的字符串的第K小子串,相同子串算一个. K<=5. 分析: 一眼看 ...

  3. 关于C/C++中main函数参数的学习

    因为面对对象作业(2018.5.21)的要求,去学习了C/C++中main函数参数的意义,以及一些简单的使用(从命令行指令的接受),不给予赘述.(仅为个人拙见,还望看官指正) 首先,带有参数的main ...

  4. MFC--串口编程---WIN API的方式将串扣操作封装在线程类中

    串口采集数据 本文档介绍的是如何获取串口原始数据并将原始数据解析成可处理或可展示的数据. 一.串口采集有很多方式: 1).MFC有一个专门的控件,直接编程采集,一个控件只能采集一个串口,而且串口名字比 ...

  5. 关于Action和EventHandler

    .net框架自带的两个常用类(Action和EventHandler),当然这两个类型的也可以自定义,但系统已经提供,直接拿来用即可,很方便 1:Action : 引用“void方法”的委托,目前框架 ...

  6. Springboot项目打成war包,部署到tomcat上,正常启动访问报错404

    前言: 项目介绍,此项目是一个Maven多模块项目,模块项目:all(父模块):util (公用的工具类):dao(实体类.业务类.mapper.mapper.xml):business(业务serv ...

  7. DDOS工具合集---CC 2.0(僵尸网络proxy,单一url,可设置cookie,refer),传奇克星(代理+单一url,可设置cookie),NetBot_Attacker网络僵尸1.0(僵尸网络,HTTP NO-Cache Get攻击模式,CC攻击,HTTP空GET请求攻击),傀儡僵尸VIP1.4版(僵尸网络,动态单一url)、上兴网络僵尸2.3、中国制造网络僵尸、安全基地网络僵尸==

    DDOS工具合集 from:https://blog.csdn.net/chinafe/article/details/74928587 CC 著名的DDOS CC工具,效果非常好!CC 2.0使用了 ...

  8. 全局ajax事件

    必须当页面上存在任何ajax请求的时候都将触发这些特定的全局ajax处理函数. 如果在jQuery.ajaxSetup()中的global属性设置成true,那么这些全局函数将会在每一个ajax上面都 ...

  9. poj1274

    题解: 二分图匹配 裸题匈牙利匹配 代码: #include<cstdio> #include<cstring> #include<cmath> #include& ...

  10. Python编码错误的解决办法SyntaxError: Non-ASCII character '\xe5' in file

    [现象] 在编写Python时,当使用中文输出或注释时运行脚本,会提示错误信息: SyntaxError: Non-ASCII character '\xe5' in file ******* [原因 ...