多校联盟#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
原创粉丝点击