腾讯笔试题-加工零件
我写了个二分查找的算法,本地测试能通过,不知道为啥,到了线上一点都通不过,大佬帮忙看看,谢谢大佬,显示的是答案错误,不是超时之类的
题的描述,给定两个大小为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;
} #笔试题目##腾讯#
