码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 第k小的数


    补充习题: 第k小的数

    问题描述

    有两个正整数数列,元素个数分别为 N N N和 M M M.从两个数列中分别任取一个数相乘,这样一共可以得到 N × M N\times M N×M个数,询问这 N × M N\times M N×M个数中第 K K K小的数是多少.

    • 数据范围:
      N , M < = 200000 , K < = 2.1 ∗ 1 0 10 , A i < = 1 0 9 ; N,M<=200000,K<=2.1*10^{10},A_i<=10^9; N,M<=200000,K<=2.1∗1010,Ai​<=109;

    solution

    ∵ a > b , c > d \because a>b, c>d ∵a>b,c>d

    ∴ a × c > b × d \therefore a \times c > b \times d ∴a×c>b×d

    设本题中的两个数组分别为 a 和 b 设本题中的两个数组分别为a和b 设本题中的两个数组分别为a和b

    ∴ 可知 , 若 a i × b j < K \therefore 可知,若a_i\times b_j < K ∴可知,若ai​×bj​<K

    则 a i − 1 , i − 2 , . . . , 1 ∗ b j , j − 1 , . . . , 1 < K 则a_{i-1,i-2,...,1} * b_{j,j-1,...,1} < K 则ai−1,i−2,...,1​∗bj,j−1,...,1​<K

    由此,这一题就好办了.

    #include 
    using namespace std;
    int n, m, k;
    int a[200001], b[200001];
    
    long long check(int x) {
    	int i = 1;
    	int j = m;
    	long long sum = 0;
    	while(j >= 1 && i <= n) {
    		while(a[i] * b[j] > x) {
    			--j;
    		}
    		sum += j;
    		++i;
    	}
    	return sum;
    }
    
    int main() {
    	cin >> n >> m >> k;
    	int max1 = -1, max2 = -1;
    	for(int i = 1; i <= n; ++i) {
    		cin >> a[i];
    		max1 = max(max1, a[i]);
    	}
    	for(int i = 1; i <= m; ++i) {
    		cin >> b[i];
    		max2 = max(max2, b[i]);
    	}
    	sort(a + 1, a + n + 1);
    	sort(b + 1, b + m + 1);
    	long long l = 1, r = max1 * max2;
    	long long ans = 0;
    	while(l <= r) {
    		long long mid = (l + r) >> 1;
    		if(check(mid) >= k) {
    			r = mid - 1;
    			ans = mid;
    		}
    		else {
    			l = mid + 1;
    		}
    	}
    	cout << ans << endl;
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
  • 相关阅读:
    pthread 常用 API 创建 销毁 调度 互斥锁 自旋锁 读写锁 条件变量
    《打造高可用PostgreSQL:策略与工具》
    从零开始实现VAE和CVAE
    c语言系统编程十四:Linux进程间的同步与互斥
    [晓理紫]CCF系列会议截稿时间订阅
    Redis 一个key-value存储系统
    Dockerfile编写实践篇
    判断二叉树是否相等
    牛客多校10 - Yet Another FFT Problem?(鸽巢原理)
    Android系统“使用其他文件打开”列表中包含自己的app
  • 原文地址:https://blog.csdn.net/MYB20091111/article/details/133530924
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号