1540 第k大数
来源:互联网 发布:万达怎么了 知乎 编辑:程序博客网 时间:2024/05/29 08:53
1540: 第k大数
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 573 Solved: 73
[Submit][Status][Web Board]
Description
有两个序列a,b,它们的长度分别为n和m,那么将两个序列中的元素对应相乘后得到的n*m个元素从大到小排列后的第k个元素是什么?
Input
输入的第一行为一个正整数T (T<=10),代表一共有T组测试数据。
每组测试数据的第一行有三个正整数n,m和k(1<=n, m<=100000,1<=k<=n*m),分别代表a序列的长度,b序列的长度,以及所求元素的下标。第二行为n个正整数代表序列a。第三行为m个正整数代表序列b。序列中所有元素的大小满足[1,100000]。
Output
对于每组测试数据,输出一行包含一个整数代表第k大的元素是多少。
Sample Input
33 2 31 2 31 22 2 11 11 12 2 41 11 1
Sample Output
311
HINT
Source
首届全国中医药院校大学生程序设计竞赛
具体解析,看下代码
#include <cstdio>#include <cmath>#include <algorithm>#include <cstring>#include <iostream>#include <string>#define ll long longusing namespace std;const int maxn=1000000+5;ll a[maxn],b[maxn];ll t,n,m,k;bool cmp(int A,int B){ return A > B;}ll jdg(ll mid){ ll cnt=0; ll j=1; for(ll i=n;i>=1;i--){ /* 这里也很细节,对a数组从最大的开始,对b数组从最小的开始,如果a*b里面某个比较小的了, 那么a[i]后面的那个题,肯定乘以比当前b[j]大的数,然后就优化出来了。 */ while(j <=m){ if(a[i]*b[j] >= mid){ cnt+=m-j+1; break ; } else{ j++; } } } return cnt;}int main(){ scanf("%lld",&t); while(t--){ scanf("%lld%lld%lld",&n,&m,&k); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int j=1;j<=m;j++) scanf("%lld",&b[j]); sort(a+1,a+1+n); sort(b+1,b+1+m); ll mid,left,right; left=a[1]*b[1];/*最小值*/ right=a[n]*b[m];/*最大值*/ ll ans; while(left <= right){ mid=(left+right)/2; /*这里可以是一点点逼近吧*/ ll ce=jdg(mid); if(ce >= k){ ans=mid; left=mid+1; } else{ right=mid-1; } } printf("%lld\n",ans); } return 0;}
阅读全文
0 0
- 1540 第k大数
- zcmu 1540: 第k大数
- ZCMU 1540 第k大数 (二分)
- 求第k大数
- 第K大数问题
- 寻找第k大数
- 区间第K大数
- zcmu1540 第k大数
- 区间第K大数
- 求第k大数
- 第K大数问题
- 找到第K大数
- 找第K大数
- 找第K大数
- 求第k大数
- 求第k大数
- 第k大数 二分法
- //第二大数(第k大数)
- 进程的同步
- 树莓派安装wordpress
- c语言的结构体
- PAT 1031. 查验身份证(15)
- StatementHandler
- 1540 第k大数
- Action类的三种编写方式(七)
- Leetcode:Word Ladder II
- 课堂总结
- 模拟实现strlen、strcpy、strcmp、strncmp等字符串函数
- msp430g2553的IIC通信
- Mapper接口
- java 动态绑定
- poj 3469 Dual Core CPU