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