zoukankan      html  css  js  c++  java
  • [计蒜客]小 B 的题目

    小 B 的题目

    Description

    小 B 给小 A 出了这样一道题:

    给定一个长为 nn 的序列 AA 和一个长为 mm 的序列 BB,在 AA 和 BB 中各取一个数相加,可以得到 n imes mn×m 个数,他想知道把这些数从小到大排序,第 kk 个数是多少(下标从 11 开始)。

    小 A 不会做,他想让你帮他解决这个问题。

    Input

    第一行三个整数 n,m,kn,m,k,表示 AA 和 BB 的长度以及小 A 想知道的是第 kk 小;

    第二行 nn 个整数,第 ii 个数表示 A_iAi

    第三行 mm 个整数,第 ii 个数表示 B_iBi

    output

    一行一个整数,表示答案。

    对于前 10\%10% 的数据,保证 1leq n,mleq 1001n,m100;

    对于前 20\%20% 的数据,保证 1leq n,mleq 2 imes10^31n,m2×103;

    对于另 20\%20% 的数据,保证 1leq n,m leq 2 imes 10^51n,m2×105, 1 le A_i, B_i le 10001Ai,Bi1000;

    对于另 30\%30% 的数据,保证 1leq n,m leq 2 imes 10^5, 1leq k leq 2 imes 10^51n,m2×105,1k2×105;

    对于剩下 30\%30% 的数据,保证 1leq n,m leq 10^61n,m106, 1 leq k leq n imes m1kn×m, 1 leq A_i,B_i leq 10^91Ai,Bi109,这部分数据有一定梯度。

    部分输入文件较大,请注意读入方式对效率的影响。

    Examples

    Input

    2 3 5
    2 2
    1 3 2

    Output

    5

    正确解法:

    样例中的 2 imes 32×3 个数从小到大排序后是 [3,3,4,4,5,5][3,3,4,4,5,5],其中第 55 个数是 55。

    暴力得了10分。

    正解是二分,从1-2e9开始找。

    然后找mid 返回是否 大于 k个。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <set>
     7 #include <map>
     8 #include <vector>
     9 using namespace std;
    10 typedef long long ll;
    11 const int inf=0x7fffffff;
    12 const int N=1000000+100;
    13 int n,m;
    14 ll k;
    15 ll a[N],b[N];
    16 bool check(int x)
    17 {
    18     ll cnt=0;
    19     for(int i=1,j=m;i<=n;i++)
    20     {
    21         while(a[i]+b[j]>x&&j>1)   j--;
    22         if(a[i]+b[j]<=x)    cnt+=j;
    23     }
    24     if(cnt>=k)   return 0;
    25     return 1;
    26 }
    27 int main()
    28 {
    29     scanf("%d %d %lld",&n,&m,&k);
    30     for(int i=1;i<=n;i++)
    31         scanf("%d",&a[i]);
    32     for(int i=1;i<=m;i++)
    33         scanf("%d",&b[i]);
    34     sort(a+1,a+n+1);
    35     sort(b+1,b+m+1);
    36     ll l=1,r=2e9;
    37     while(l<=r)
    38     {
    39         ll mid=(l+r+1)/2;
    40         if(check(mid))  l=mid+1;
    41         else r=mid-1;
    42     }
    43     printf("%lld
    ",l);
    44 
    45 
    46     return 0;
    47 }
    View Code
    No matter how you feel, get up , dress up , show up ,and never give up.
  • 相关阅读:
    数据仓库经验小结(转)
    SSIS高级内容 系列一
    SSIS高级内容 系列二
    SSIS数据流组件开发(1)转载
    在sharepoint中添加视频播放
    处理数据仓库中历史数据的若干问题
    SSIS数据流组件开发(2) 转载
    [转载]俄罗斯只剩“大国的脾气”
    [转载]游击队员之歌
    [转载]世界是女人的
  • 原文地址:https://www.cnblogs.com/Kaike/p/10711674.html
Copyright © 2011-2022 走看看