多校联盟#con1 数学题

    xiaoxiao2021-03-25  51

    题意:

    现在有两个数组 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(); } }
    转载请注明原文地址: https://ju.6miu.com/read-39935.html

    最新回复(0)