腾讯笔试题-加工零件

我写了个二分查找的算法,本地测试能通过,不知道为啥,到了线上一点都通不过,大佬帮忙看看,谢谢大佬,显示的是答案错误,不是超时之类的

题的描述,给定两个大小为N的数组,数组之间相乘会产生 个数,求第K小的数是什么

  • 输入
    • 第一行 N K (N < e5, K <e19)
    • 第二行 a_i (N个数,每个数 a_i < e5)
    • 第三行 b_i (N个数,每个数 b_i < e5)
  • 输出
    • 第K小的数

示例

输入:
3 2
1 2 3
1 2 3
输出:
2
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

int Cal(vector<int> &A, vector<int> &B, long &mid){
    long long ans = 0;
    for(int i = 0; i < A.size(); ++i){
        int j = 0;
        if(A[i] * B[j] > mid) break;
        for(++j; j < B.size() && A[i] * B[j] <= mid; ++j);
        ans += j;
    }
    return ans;
}

int Find(vector<int> &A, vector<int> &B, long long &K) {
    long t = sqrt(K), l = A[0] * B[0], r = A[t + 1] * B[t + 1];
    while(l <= r){
        long mid = (l + r) >> 1;
        long long tmp = Cal(A, B, mid);
        if(tmp <= K)
            l = mid + 1;
        else
            r = mid - 1;
    }
    return r + 1;
}

int main(){
    int N;
    long long K; 
    cin >> N >> K;
    vector<int> A(N), B(N);
    for(int i = 0; i < N; ++i) cin >> A[i];
    for(int i = 0; i < N; ++i) cin >> B[i];
    sort(A.begin(), A.end());
    sort(B.begin(), B.end());
    if(K >= N * N){
        cout << A.back() * B.back() << endl;
    }else{
        long res = Find(A, B, K);
        cout << res << endl;
    }
    return 0;
}
#笔试题目##腾讯#
全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务