zoukankan      html  css  js  c++  java
  • 51nod 1105 二分好题

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1105

    1105 第K大的数

    基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
    收藏
    关注
    数组A和数组B,里面都有n个整数。数组C共有n^2个整数,分别是A[0] * B[0],A[0] * B[1] ......A[1] * B[0],A[1] * B[1]......A[n - 1] * B[n - 1](数组A同数组B的组合)。求数组C中第K大的数。
    例如:A:1 2 3,B:2 3 4。A与B组合成的C包括2 3 4 4 6 8 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
    好巧妙的二分套二分啊,套路啊= =
    我们可以对这个数的大小进行二分,判断一下小于等于这个mid的有多少个数,有多少个数不就说明这个数排第几吗,只要找到一个mid小于等于他的数==k就说明这是第K小的数,
    题目的第K大也就是第N*N-K+1小,在统计小于等于mid的数的个数时,也要用二分,我们可以先对AB排序然后枚举每一个Ai,二分查找最多能匹配多少个Bj,累加即可。
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 using namespace std;
     6 #define LL long long 
     7 LL inf = (LL)1e18+5;
     8 LL A[50005], B[50005];
     9 LL cal(LL K,LL N )
    10 {
    11     LL r = 0;
    12     for (int i = 1;i <= N;++i)
    13     {
    14         LL x = K / A[i];
    15         if (x < B[1])continue;
    16         LL k = upper_bound(B + 1, B + 2 + N, x) - B;
    17         r += k - 1;
    18     }
    19     return r;
    20 }
    21 int main()
    22 {
    23     LL N, K, i;
    24     cin >> N >> K;
    25     for (i = 1;i <= N;++i)scanf("%lld%lld", A + i, B + i);
    26     sort(A + 1, A + N + 1);
    27     sort(B + 1, B + 1 + N);
    28     A[N + 1] = B[N + 1] = inf;
    29     A[0] = B[0] = -1;
    30     LL l = 1,r = 1e18;
    31     K = N*N - K + 1;
    32     while (l < r) {
    33         LL mid = l + (r - l) / 2;
    34             if (cal(mid,N) < K) l = mid + 1;
    35             else r = mid;   //为了防止答案是mid但是有许多重复的导致cal返回值大于k,我们在这里让r=mid仍然使得mid可以被查找到,而不是被忽略
    36     }
    37     printf("%lld
    ", l);
    38     return 0;
    39 }
  • 相关阅读:
    生成 n 位验证码的函数
    delphi的procedure of object
    delphi 文本 记录 流式 读写文件
    delphi save .dfm to .txt
    delphi xml
    delphi json
    delphi http server
    dac FDMemTable
    dac oracle
    dac mssql server
  • 原文地址:https://www.cnblogs.com/zzqc/p/7425448.html
Copyright © 2011-2022 走看看