zoukankan      html  css  js  c++  java
  • 51nod 1105(第K大数 二分套二分)

    题目链接:http://www.51nod.com/onlineJudge/submitDetail.html#!judgeId=620811

    参考自:https://blog.csdn.net/f_zyj/article/details/51990962

    基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
    收藏
    关注
    数组A和数组B,里面都有n个整数。
    数组C共有n^2个整数,分别是:
    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[n - 1] * B[0],A[n - 1] * B[1]  ......  A[n - 1] * B[n - 1]
    是数组A同数组B的组合,求数组C中第K大的数。
     
    例如:
    A:1 2 3,B:2 3 4。
    A与B组合成的C为
             A[0]  A[1]  A[2]
    B[0]     2      3      4
    B[1]     4      6      8
    B[2]     6      9     12
    共9个数。
    Input
    第1行:2个数N和K,中间用空格分隔。N为数组的长度,K对应第K大的数。(2 <= N <= 50000,1 <= K <= 10^9)
    第2 - N + 1行:每行2个数,分别是A[i]和B[i]。(1 <= A[i],B[i] <= 10^9)
    Output
    输出第K大的数。
    Input示例
    3 2
    1 2
    2 3
    3 4
    Output示例
    9

    解题思路:总共有n*n个数,要查找第K大数,即查找第n*n+k-1小数,先对两个数组进行排序,对该区间范围进行二分,然后判断比该数小的数数目是比n*n+k-1多还是少。
    附上代码
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll maxn=5e4+7;
    ll n,k,A[maxn],B[maxn];
    
    ll check(ll x)
    {
        ll j=n,cnt=0;
        for(int i=1;i<=n;i++)
        {
            while(j>0)
            {
                if(A[i]*B[j]>x)
                j--;
                else
                break;
            }
            cnt+=j;
        }
        return cnt;
    }
    
    int main()
    {
        scanf("%lld%lld",&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+1+n);
        ll low=A[1]*B[1];
        k=n*n-k+1;
        ll high=A[n]*B[n];
        while(low<=high)
        {
            ll mid=(low+high)>>1;
            if(check(mid)>=k)
            high=mid-1;
            else
            low=mid+1;
        }
        printf("%lld
    ",low);
    }
  • 相关阅读:
    CentOS7配置本地yum源和在线yum源
    Centos7中安装samba服务器
    phpmydmain登录问题
    java实现简单的加法器
    我的偶像 凯文 米特尼克 简介
    安全好的地方分享
    a标签
    Vmware虚拟机 的工作模式
    java面板
    java的套接字实现远程连接
  • 原文地址:https://www.cnblogs.com/zjl192628928/p/9555881.html
Copyright © 2011-2022 走看看