多校联盟#con1 数学题
来源:互联网 发布:淘宝女装店铺推广方案 编辑:程序博客网 时间:2024/05/22 13:49
题意:
现在有两个数组 A B 所有A里的元素/所有B里面的元素中第k大的是什么
tip:
二分答案,检验有没有k-1个比他大的时候,排序两个数组 可使用双指针,一个从A数组最后开始,一个从B数组最后一个开始,如果这个比当前的答案大,那么b数组前面的,分母减小,比值肯定都大于答案,直接+=m个,如果比答案小,减小b的值(A的值减小,刚才不合格的B肯定更不会比当前答案大了),所以两个指针都最坏的情况下走n+m次。
#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int maxn = 1e5+10;const double eps = 1e-3;double a[maxn],b[maxn];int n,m,k;void init(){ scanf("%d%d%d",&n,&m,&k); for(int i = 1; i<= n ; i++) scanf("%lf",&a[i]); sort(a+1,a+1+n); for(int j = 1; j <= m ; j++) scanf("%lf",&b[j]); sort(b+1,b+1+n);}int check(double t){ int cnt = 0; int linka = n,linkb = m; while(linkb >= 1){ if(cnt > k-1) return 1; if(a[linka]/b[linkb] >= t){ cnt += linkb; linka--; } else{ while(a[linka]/b[linkb] < t) linkb--; } } return 0;}void bsech(){ double l = a[1]/b[n],r = a[n]/b[1],mid; //cout << l <<" "<<r<<endl; while(r-l > eps){ mid = l+(r-l)/2.0; if(check(mid)) l = mid; else r = mid; } printf("%.2lf\n",(l+r)*0.5);}int main(){ int T; scanf("%d",&T); while(T--){ init(); bsech(); }}
0 0
- 多校联盟#con1 数学题
- 多校联盟#con1 矩阵快速幂
- 多校联盟#con1 等差区间
- 多校联盟#con1 埃蒙的时空航道
- 2015多校联盟
- 多校联盟-()
- hdu5753(2016多校第三场,数学题)
- 2016多校联赛 hdu5826 physics 数学题
- 多校联盟--20140801--G - Christmas Play
- hdu6124 Euler theorem -多校联盟7
- 巴什博奕(多校联盟六)
- 数学题
- 数学题
- 数学题
- 数学题
- 数学题
- 数学题
- 数学题
- Java Web开发Session超时设置
- 解决Android Studio DDMS 中文件打不开的问题
- 使用git命令修改指定的commit提交记录并提交到远程服务器的方法
- 基于How To Tango With Django 1.7的实践(1)
- 1
- 多校联盟#con1 数学题
- 将Excel表格或者CSV文件导入到Mysql中
- spark sql 中出现的问题
- hibernate二级只读缓存设置 --oracle 是对sessionFactory而言的
- [LeetCode]372. Super Pow
- Codeforces #402 (Div. 2) C. Dishonest Sellers
- 输入n个整数,找出其中最小的K个数
- Python3 从HTTP代理网站批量获取代理并筛选
- RAFT 论文中文翻译(1)