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
思路:二分,先排序,首先二分答案,答案的范围在ans[0]*bns[0]---ans[n-1]*bns[n-1]之间,然后二分统计这个答案的前面是否有大于等于k个比他大的,符合的话并且二分检查这个答案是否存在。
- 1 #include<stdio.h>
- 2 #include<algorithm>
- 3 #include<iostream>
- 4 #include<string.h>
- 5 #include<queue>
- 6 #include<math.h>
- 7 #include<set>
- 8 #include<vector>
- 9 #include<string.h>
- 10 using namespace std;
- 11 typedef long long LL;
- 12 typedef struct node {
- 13 LL x;
- 14 LL y;
- 15 } ss;
- 16 LL ans[60000];
- 17 LL bns[60000];
- 18 bool check(LL n,LL N,LL M) {
- 19 int i,j;
- 20 LL cnt = 0;
- 21 for(i = 0; i < N; i++) {
- 22 int l = 0;
- 23 int r =N;
- 24 int id = -1;
- 25 while(l<=r) {
- 26 int mid = (l+r)/2;
- 27 if(bns[mid]*ans[i]>=n) {
- 28 id = mid;
- 29 r = mid - 1;
- 30 } else l= mid + 1;
- 31 }
- 32 if(id!=-1) {
- 33 if(n==12)printf("%d\n",id);
- 34 cnt += N-id;
- 35 }
- 36 }
- 37 if(cnt>=M)return true;
- 38 return false ;
- 39 }
- 40 bool er(int n,int m,int ask);
- 41 bool test(LL mid,LL N,LL M);
- 42 int main(void) {
- 43 LL N,M;
- 44 scanf("%lld %lld",&N,&M);
- 45 int i,j;
- 46 for(i = 0; i < N; i++) {
- 47 scanf("%lld %lld",&ans[i],&bns[i]);
- 48 }
- 49 sort(ans,ans+N);
- 50 sort(bns,bns+N);
- 51 LL ak = ans[0]*bns[0];
- 52 LL bk = ans[N-1]*bns[N-1];
- 53 LL all = -1;//printf("%lld %lld\n",ak,bk);
- 54 while(ak<=bk) {
- 55 LL mid = (ak+bk)/2;
- 56 if(check(mid,N,M)) {
- 57 if(test(mid,N,M))
- 58 all = max(mid,all);
- 59 ak = mid + 1;
- 60 } else bk = mid-1;
- 61 }
- 62 printf("%lld\n",all);
- 63 return 0;
- 64 }
- 65 bool test(LL mid,LL N,LL M) {
- 66 int i,j;
- 67 LL kk;
- 68 for(i = 0; i < N; i++) {
- 69 if(mid%ans[i]==0) {
- 70 if(er(0,N,mid/ans[i]))
- 71 return true;
- 72 }
- 73 }
- 74 }
- 75 bool er(int n,int m,int ask) {
- 76 if(n>m)return false;
- 77 int mid = (n+m)/2;
- 78 if(bns[mid]==ask) {
- 79 return true;
- 80 } else if(bns[mid]>ask) {
- 81 return er(n,mid-1,ask);
- 82 } else return er(mid+1,m,ask);
- 83 }
复杂度N*log(N);
1105 第K大的数的更多相关文章
- 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 ...
- 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 ...
- 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] * ...
- [51NOD1105]第k大的数(二分答案)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1105 先排序,二分上下界分别是最小的两个数和最大的两个数的乘积 ...
- POJ 2985 The k-th Largest Group(树状数组 并查集/查找第k大的数)
传送门 The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8690 Acce ...
- 51nod p1175 区间中第K大的数
1175 区间中第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 一个长度为N的整数序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有 ...
随机推荐
- LATEX公式语法
see how any formula was written in any question or answer, including this one, right-click on the ex ...
- mac系统升级导致VirtualBox报Kernel driver not installed (rc=-1908)
一.背景 最近将我的Mac升级成了Monterey版本,结果发现之前的安装的VirtualBox虚拟机无法启动,报了如下错误. Kernel driver not installed (rc=-190 ...
- C#多个标题头合并
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) { switch (e.Row.RowType) ...
- 1005.K次取反后最大化的数组和
1005.K次取反后最大化的数组和 目录 1005.K次取反后最大化的数组和 题目 题解 排序+维护最小值min 题目 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 ...
- mongDB进阶
Mongo进阶 聚合 聚合操作将来自多个文档的值组合在一起,并且可以对分组数据执行各种操作以返回单个结果. 文档进入多阶段管道,将文档转换为聚合结果 聚合管道 例子: 第一阶段:过滤,$match 第 ...
- windows Notepad++ 上配置 vs 编译器 , 编译并运行
windows 中 配置 vs编译器 在Linux下,Kris是倾向于在终端中使用gcc和g++来编译C/C++的,在Windows下相信很多人都是选择臃肿的Visual Studio,我亦不免如此. ...
- android Paint 详解
/** * Paint类介绍 * * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体 ...
- 【Linux】【Services】【SaaS】Docker+kubernetes(5. 安装和配置ETCD集群)
1. 简介: 1.1. ETCD是kubernetes和openstack都用到的组件,需要首先装好 1.2. 官方网站:https://coreos.com/etcd/ 1.3. ETCD的作用: ...
- 二级C复习
二级C语言 队列 计算队列中元素个数 种 : rear > front ,直接减 第二种: rear < front 上面两种综合一起,求元素个数公式 :(r - f + maxsize) ...
- 可扩展标记语言XML(淅淅沥沥的小雨)
XML简述 XML用于描述数据,是当前处理结构化文档信息的有力工具.与操作系统编程语言的开发平台无关,可以实现不同系统之间的数据交互. xml文件结构: 1 <?xml version=&quo ...