H: Dave的组合数组(二分法)
Dave的组合数组
Time Limit: C/C++ 1 s Java/Python 3 s Memory Limit: 128 MB Accepted: 3 Submit: 14
Submit My Status
Problem Description
数组 AA 和数组 BB ,里面都有 nn 个整数。
数组 CC 共有 n2n2 个整数,分别是:
A[0]∗B[0],A[0]∗B[1]......A[0]∗B[n−1]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[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[n−1]∗B[0],A[n−1]∗B[1]......A[n−1]∗B[n−1]
是数组 AA 同数组 BB 的组合,求数组 CC 中第 KK 大的数。
例如:
A:123,B:234A:123,B:234。
AA与BB组合成的CC为
A[0]A[0] A[1]A[1] A[2]A[2]
B[0]B[0] 22 33 44
B[1]B[1] 44 66 88
B[2]B[2] 66 99 1212
共9个数。
Input
第1行:22个数NN和KK,中间用空格分隔。NN为数组的长度,KK对应第KK大的数。(2≤N≤50000,1≤K≤109)(2≤N≤50000,1≤K≤109)
第−N+1−N+1行:每行2个数,分别是A[i]和B[i]。(1≤A[i],B[i]≤109)(1≤A[i],B[i]≤109)
Output
输出第K大的数。
Sample Input
3 2
1 2
2 3
3 4
Sample Output
9
分析:对A数列和B数列进行排序,然后二分法找出第k大
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll a[50005],b[50005];
int n;
ll cmd(int x,int y)
{
return x>y;
}
int num(ll mid)
{
int j=1;
//int j=n;
ll ans=0;
for(int i=1;i<=n;i++)
{
while(a[i]*b[j]>mid)//因为a从大到小排序,所以后面的a匹配的个数在前面a匹配个数的基础上加
j++;
ans+=j-1;//当前所有i匹配到的j的个数
// while(j>=0&&a[i]*b[j]>mid)
// j--;
// ans+=n-j;
}
return ans+1;//比它大的有ans个,它是第ans+1大
}
int main()
{
int k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%lld%lld",&a[i],&b[i]);
sort(a+1,a+n+1);//从小到大
sort(b+1,b+n+1,cmd);//从大到小
ll x=a[1]*b[n];//最小
ll y=a[n]*b[1];//最大
//sort(b+1,b+n+1);
// ll x=a[1]*b[1];
// ll y=b[n]*a[n];
while(x!=y)
{
ll mid=x+y>>1;
int kk=num(mid);//找mid是第几大
if(kk<=k)//mid排名比k前,mid在第k大后面
y=mid;
else
x=mid+1;
}
printf("%lld\n",x);
return 0;
}
H: Dave的组合数组(二分法)的更多相关文章
- poj 1743 Musical Theme (后缀数组+二分法)
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 16162 Accepted: 5577 De ...
- Java之组合数组1
我们先说"数组",数组是有序数据的集合,数组中的每个元素具有相同的数组名和下标来唯一地确定数组中的元素. 一.一维数组的定义 type arrayName[]; 其中类型(type ...
- java中的数组二分法
数组二分法意在以较快的速度查找到某个值的下标位置. 二分法的核心思想:找到一个数组的中间位置值,判断某个数值是在这个中间值的左边还是右边,如果是左边,将中间位置之前进行二分,二分后,结束位置变为原始中 ...
- Java中数组二分法查找
算法:当数组的数据量很大适宜采用该方法.采用二分法查找时,数据需是有序不重复的,如果是无序的也可通过选择排序.冒泡排序等数组排序方法进行排序之后,就可以使用二分法查找. 基本思想:假设数据是按升序排序 ...
- SparseArray HashMap 稀疏数组 二分法
简介 HashMap是java里比较常用的一个集合类,我们常用其来缓存一些处理后的结果,但是在Android项目中,Eclipse却给出了一个 performance 警告.意思就是说用SparseA ...
- POJ1743---Musical Theme(+后缀数组二分法)
Description A musical melody is represented as a sequence of N (1<=N<=20000)notes that are int ...
- 2018牛客网暑假ACM多校训练赛(第五场)H subseq 树状数组
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round5-H.html 题目传送门 - https://www.no ...
- ENUMSTXT.H中的指针数组
/************************************************************************ ...
- php 数组二分法查找函数
找到返回对应的key,找不到返回-1,注意二分查找需要数组有序,下边函数需要数组递增排序. function binarySearch($arr,$x){ $start=0; $end=count($ ...
随机推荐
- Selenium: Trying to log in with cookies and get the errorMessage - “Can only set cookies for current domain” or "Unable to set Cookie"
from selenium import webdriver driver = webdriver.PhantomJS(executable_path='G:/OpenSources/phantomj ...
- Idea实用配置
参考:https://github.com/judasn/IntelliJ-IDEA-Tutorial 1.代码提示不区分大小写 2.跳到指定行 Ctrl + G Ctrl 快捷键 介绍 Ctrl + ...
- Python全栈(第一部分)day1
计算机基础 cpu:相当于人的大脑,用于计算. 内存:储存数据,4G,8G,16G,32G,成本高,断电即消失. 硬盘:1T,固态硬盘,机械硬盘,储存数据,应该长久保持数据,重要文件,小电影等等. 操 ...
- Mac 远程桌面 ubuntu16.04 unity
待解决问题: 使用 vnc 远程桌面 ubunt16.04的自带桌面 unity 尝试方法 : 查看了各种方法, 基本都是曲线救国, 安装 gnome 或者 xfce4等其他桌面系统, 而我只想用好看 ...
- sumafan:python爬虫多线程爬取数据小练习(附答案)
抓取 https://www.cnbeta.com/ 首页中新闻内容页网址, 抓取内容例子: https://hot.cnbeta.com/articles/game/825125 将抓取下来的内容页 ...
- 微信小程序采坑(一)
1.微信小程序如何让text内容空格 <text decode="{{true}}" space="{{true}}"> </text> ...
- $Django 等web框架,交互,基础入门
1 web 应用2 c/s 和bs架构3 python中的web框架 a :socket b:路由跟视图函数匹配关系 c:模板渲染 django: uwsgi/wsgiref ...
- python批量解析域名a记录
#encoding:utf-8 import requests import json import dns.resolver import sys reload(sys) sys.setdefaul ...
- simulate events
windows system maintains a msg queue, and any process that supports msg will create an thread that h ...
- 36)django-jsonp跨域
一:什么是JSONP JSONP(JSON with Padding)是JSON的一种"使用模式",可用于解决主流浏览器的跨域数据访问的问题.由于同源策略,一般来说位于 serve ...