51NOD 1105 第K大的数
数组A和数组B,里面都有n个整数。
数组C共有n^2个整数,分别是:
A[0] * B[0],A[0] * B[1] ...... A[0] * B[n-1]
A[1] * B[0],A[1] * B[1] ...... A[1] * B[n-1]
......
A[n - 1] * B[0],A[n - 1] * B[1]  ......  A[n - 1] * B[n - 1]
是数组A同数组B的组合,求数组C中第K大的数。
例如:
A:1 2 3,B:2 3 4。
A与B组合成的C为
A[0]  A[1]  A[2]
B[0]     2      3      4
B[1]     4      6      8
B[2]     6      9     12
共9个数。
调试日志: 没有弄清二分值在满足条件的情况下是应该尽可能小还是尽可能大
Solution
首先对两数组进行排序
现在解决这一个问题: 给定一个数 \(k\) 求两两相乘 \(n^{2}\) 个数中有多少个 \(<= k\)
类似 \(Two Points\) 解决
因为已经排序, 所以在确定一组解 \(a_{i} * b_{j} <= k\) 后, 随着 \(i\) 的递增, 若继续满足条件 \(j\) 必定递减
这样便可以在 \(O(n)\) 的时间内询问一次
二分 \(k\) 即可得到答案
注意这里是第 \(K\) 小, 需要转换为第 \(K\) 大
然后复习二分
保险起见, 二分时无论写法默认开区间
再保险起见, 二分时用变量 \(ans\) 记录可行答案, 最后返回 \(ans\)
这时需要分清二分值在满足条件的情况下是应该尽可能小还是尽可能大
其实不对你就换一个就OK了, 不过我们不能糟蹋这门学科是吧
这题需要找的是 序列中的值 , 故二分的值尽可能小(来满足存在于序列中)
Code
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#define LL long long
using namespace std;
LL RD(){
    LL out = 0,flag = 1;char c = getchar();
    while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
    while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
    return flag * out;
    }
const LL maxn = 100019;
LL num, K;
LL a[maxn], b[maxn];
bool check(LL k){
	LL cnt = 0;
	for(LL i = 1, j = num;i <= num;i++){
		while(a[i] * b[j] > k)j--;
		cnt += j;
		}
	if(cnt < K)return 1;
	return 0;
	}
LL search(LL l, LL r){
	LL ans;
	while(l <= r){
		LL mid = (l + r) >> 1;
		if(check(mid))l = mid + 1;
		else ans = mid, r = mid - 1;
		}
	return ans;
	}
int main(){
	num = RD(), K = RD(), K = (LL)num * num - K + 1;
	for(LL i = 1;i <= num;i++)a[i] = RD(), b[i] = RD();
	sort(a + 1, a + 1 + num), sort(b + 1, b + 1 + num);
	printf("%lld\n",search(0, 1e18 + 19));
	return 0;
	}
51NOD 1105 第K大的数的更多相关文章
- 51nod 1105 第K大的数 【双重二分/二分套二分/两数组任意乘积后第K大数】
		1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * ... 
- 51 nod 1105 第K大的数
		1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * ... 
- 1105 第K大的数(二分)
		1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * B[0],A[0 ... 
- 1105 第K大的数
		1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * B[0],A[0] * B[1] ...... ... 
- AC日记——第K大的数 51nod 1105
		1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * ... 
- 51nod 1105:第K大的数
		1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * ... 
- 51nod p1175 区间中第K大的数
		1175 区间中第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 一个长度为N的整数序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有 ... 
- 51nod 区间中第K大的数
		区间中第K大的数 基准时间限制:1 秒 空间限制:131072 KB 一个长度为N的整数序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,第K大的数是多少. 例如: 1 7 6 ... 
- 51Nod 1175 区间中第K大的数 (可持久化线段树+离散)
		1175 区间中第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 一个长度为N的整数序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有 ... 
随机推荐
- 【Alpha版本发布】爬虫队长正在待命!
			一.基础功能简介 本团队的爬虫能够从网上搜索相关内容, 并归类,把所爬到的网页或各种类型的文档下载到本地上. 上届团队Beta版本爬虫的主要功能如下: a)可爬取网页,问答页并进行问答文件分类. b) ... 
- asp.net如何隐藏表格(table)的一行
			直接用jquery $("#id1").click(function(){ $("#trId").css("display""no ... 
- git学习(一) 如何将项目上传到github
			用了github有了段时间,但是感觉都是断断续续的,这次花了点时间来总结下,已方便下次忘记的时候拿出来看一下: 自己主要是参考了这个网站来学习的: git教程 -廖雪峰 第一步: 创建github账号 ... 
- paperOne基于java web的简易四则运算出题网站
			项目成员:张金生 张政 需求概要 1.运算数均为正整数 2.包含的运算符有+,-,*,/ 3.除法运算结果为整除运算 4.批量生成题目并判题 核心功能分析 1.题目生成——java后端 题目生 ... 
- [51CTO]反客为主 ,Linux 成为微软 Azure 上最流行的操作系统
			反客为主 ,Linux 成为微软 Azure 上最流行的操作系统 [世界上唯一确定不变的就是世界在不停的变化] 三年前,微软云计算 Azure 平台 CTO Mark Russinovich 说有四分 ... 
- Vue 爬坑之路(一)—— 使用 vue-cli 搭建项目  (增补)
			cd 指定好安装目录 vue init webpack 项目名称 执行 vue vue list 查看可应用模板 vue init webpack +名字 项目已启动 
- how install svn client on MacOS
			how install svn client on MacOS svn https://www.smartsvn.com/downloads/smartsvn/smartsvn-macosx-11_0 ... 
- BZOJ1853_幸运数字
			如果一个数字仅由6或者8构成,那么这个数字是幸运数字:如果一个数字是幸运数字的倍数,那么就是近似的幸运数. 给定区间,求有多少个近似幸运数字位于这个区间之内. 典型的容斥原理. 首先,弄出所有的幸运数 ... 
- Convolutional Neural Networks卷积神经网络(二)
			转自http://blog.csdn.net/zouxy09/article/details/8781543 CNNs是第一个真正成功训练多层网络结构的学习算法.它利用空间关系减少需要学习的参数数目以 ... 
- Netty基础系列(3) --彻底理解NIO
			前言 上一节中我们提到了同步异步与阻塞非阻塞的区别,知道了同步并不等于阻塞.而本节的主角NIO是一种同步非阻塞的I/O模型,并且是I/O多路复用模型.NIO在java中被称为 New I/O.它并不能 ... 
