51nod 1105:第K大的数


第1行:2个数N和K,中间用空格分隔。N为数组的长度,K对应第K大的数。(2 <= N <= 50000,1 <= K <= 10^9)
第2 - N + 1行:每行2个数,分别是A[i]和B[i]。(1 <= A[i],B[i] <= 10^9)
输出第K大的数。
3 2
1 2
2 3
3 4
9
之前做过的left right都是数组的下标,找数组中的元素。这次是直接给那个数的范围,找数组中的数。
双二分。一开始我是想第k大的数,即是
第n*n-k+1小的数,所以找小的元素,结果前19组test都过了,就第20组一直WA。后来想N最大50000,N*N超过了long long了。这个思路只能被划掉。乖乖找第k大的,记录有多少比mid大的,再去比较。
代码:
<pre name="code" class="cpp">#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; long long a[50005], b[50005];
int len, k; int search(long long y, long long x)
{
int i, left = 1, right = len;
long long mid, ans=len;
while (left <= right)
{
mid = left + (right - left) / 2;
if (a[y] * b[mid] >= x)
{
ans = min(ans, mid);
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return ans;
} bool check(long long x)
{
int i, ans = 0;
for (i = 1; i <= len; i++)
{
if (a[i] * b[len] < x)continue;
ans += ((len- search(i, x))+1);
}
return ans >= k;
} int main()
{
int i;
long long start, end, mid, ans;
cin >> len >> k;
for (i = 1; i <= len; i++)
cin >> a[i] >> b[i]; sort(a + 1, a + len + 1);
sort(b + 1, b + len + 1); start = a[1] * b[1] - 1;
end = a[len] * b[len] + 1;
ans = 0; while (end - start > 1)
{
mid = start + (end - start) / 2;
if (check(mid))
{
ans = max(ans, mid);
start = mid;
}
else
{
end = mid;
}
}
cout << ans << endl; return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
51nod 1105:第K大的数的更多相关文章
- 51nod 1105 第K大的数 【双重二分/二分套二分/两数组任意乘积后第K大数】
1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * ...
- 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 ...
- 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 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的所有 ...
随机推荐
- redis api-String
- ubuntu最基本的软件
输入法: https://www.cnbawwwlogs.com/zlslch/p/6943318.html qq: http://www.linuxidc.com/Linux/2016-09/134 ...
- Day2-O-Coloring a Tree CodeForces-902B
You are given a rooted tree with n vertices. The vertices are numbered from 1 to n, the root is the ...
- 「UVA10559」Blocks
传送门 Luogu 解题思路 考虑区间 \(\text{DP}\). 设 \(f[i][j][k]\) 表示 \([i,j]\) 这段区间接上后面 \(k\) 个与 \(j\) 颜色相同的块得到的答案 ...
- Python Sklearn.metrics 简介及应用示例
Python Sklearn.metrics 简介及应用示例 利用Python进行各种机器学习算法的实现时,经常会用到sklearn(scikit-learn)这个模块/库. 无论利用机器学习算法进行 ...
- 一 CRM 注册功能实现
前端:登陆页面按钮跳转到注册页面 dao: 配置连接池 配置session工厂,Hibernate核心配置,映射 配置UserDao,注入session工厂 UserDao:继承HibernateD ...
- 十一 JSP&EL&JSTL
1 什么是JSP? 从用户角度看待,是一个网页从程序员角度,其实是一个Java类,他继承了Servlet,所以可以直接说JSP就是一个Servlet 为什么会有JSP?html多数情况下用来显示静态内 ...
- 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:接口的基本实现
interface A{ // 定义接口A public static final String AUTHOR = "李兴华" ; // 全局常量 public abstract ...
- Deepctr框架代码阅读
DeepCtr是一个简易的CTR模型框架,集成了深度学习流行的所有模型,适合学推荐系统模型的人参考. 我在参加比赛中用到了这个框架,但是效果一般,为了搞清楚原因从算法和框架两方面入手.在读代码的过程中 ...
- Mozilla Firefox 68 正式发布下载:对刚Chrome
Mozilla Firefox 68开源和跨平台Web浏览器现在正式发布,可以下载适用于GNU/Linux,Mac和Windows平台的Firefox 68了. Firefox 68网络浏览器现在可以 ...