BL13. 孙悟空的徒弟
描述
打败魔人布欧以后,孙悟空收了n个徒弟,每个徒弟战斗力各不相同。他教导所有的徒弟和体术,合体后战斗力为原战斗力相乘。任何两个徒弟都可以合体,所以一共有n*(n-1)/2种合体徒弟。有一天,他想考验一下孙悟天战斗力如何,希望在所有n*(n-1)/2种合体徒弟中选择战斗力第k高的,与孙悟天对战。可是孙悟空徒弟太多了,他已然懵逼,于是找到了你,请你帮他找到对的人。
输入描述
第一行两个int。徒弟数量:n <= 1*10^6;战斗力排名:k <= n*(n-1)/2输出描述
战斗力排名k的合体徒弟战斗力。示例1
输入:
5 2 1 3 4 5 9
输出:
36
C++14 解法, 执行用时: 154ms, 内存消耗: 9140KB, 提交时间: 2020-09-21
#include<iostream> #include<vector> #include<list> #include<algorithm> int main() { std::ios::sync_with_stdio(false); long long n, k; std::cin >> n >> k; std::vector<int> arr(n); for (auto& a : arr) { std::cin >> a; } std::sort(arr.begin(), arr.end()); long long l = 1; long long r = arr[n - 1] * arr[n - 2]; while (l < r) { long long mid = (l + r + 1) / 2; long long count = 0; int i = 0; int j = n - 1; while (i < j && count < k) { while (i < j && arr[i] * arr[j] < mid) { i++; } count += j - i; j--; } if (count >= k) { l = mid; } else { r = mid - 1; } } std::cout << l; return 0; }
C++ 解法, 执行用时: 155ms, 内存消耗: 9028KB, 提交时间: 2020-08-13
#include<iostream> #include<vector> #include<list> #include<algorithm> int main() { std::ios::sync_with_stdio(false); long long n, k; std::cin >> n >> k; std::vector<int> arr(n); for (auto& a : arr) { std::cin >> a; } std::sort(arr.begin(), arr.end()); long long l = 1; long long r = arr[n - 1] * arr[n - 2]; while (l < r) { long long mid = (l + r + 1) / 2; long long count = 0; int i = 0; int j = n - 1; while (i < j && count < k) { while (i < j && arr[i] * arr[j] < mid) { i++; } count += j - i; j--; } if (count >= k) { l = mid; } else { r = mid - 1; } } std::cout << l; return 0; }
C++ 解法, 执行用时: 157ms, 内存消耗: 8980KB, 提交时间: 2020-08-14
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { ios::sync_with_stdio(false); long long n,k; cin>>n>>k; vector<int> arr(n,0); vector<int> ret; for(int i=0;i<n;++i) { cin>>arr[i]; } sort(arr.begin(),arr.end()); n=arr.size(); long long mid=0,l=1,r=arr[n-1]*arr[n-2]; while(l<r) { mid=(l+r+1)/2; int low=0,high=n-1; long long cnt=0; while(low<high&&cnt<k) { while(low<high&&arr[low]*arr[high]<mid) low++; cnt+=max(high-low,0); high--; } if(cnt>=k) l=mid; else r=mid-1; } printf("%lld",l); return 0; }
C++14 解法, 执行用时: 157ms, 内存消耗: 9120KB, 提交时间: 2020-08-27
#include<iostream> #include<vector> #include<list> #include<algorithm> int main() { std::ios::sync_with_stdio(false); long long n, k; std::cin >> n >> k; std::vector<int> arr(n); for (auto& a : arr) { std::cin >> a; } std::sort(arr.begin(), arr.end()); long long l = 1; long long r = arr[n - 1] * arr[n - 2]; while (l < r) { long long mid = (l + r + 1) / 2; long long count = 0; int i = 0; int j = n - 1; while (i < j && count < k) { while (i < j && arr[i] * arr[j] < mid) { i++; } count += j - i; j--; } if (count >= k) { l = mid; } else { r = mid - 1; } } std::cout << l; return 0; }
C++ 解法, 执行用时: 158ms, 内存消耗: 4216KB, 提交时间: 2020-10-31
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { ios::sync_with_stdio(false); long long n,k; cin>>n>>k; vector<int> arr(n,0); vector<int> ret; for(int i=0;i<n;++i) { cin>>arr[i]; } sort(arr.begin(),arr.end()); n=arr.size(); long long mid=0,l=1,r=arr[n-1]*arr[n-2]; while(l<r) { mid=(l+r+1)/2; int low=0,high=n-1; long long cnt=0; while(low<high&&cnt<k) { while(low<high&&arr[low]*arr[high]<mid) low++; cnt+=max(high-low,0); high--; } if(cnt>=k) l=mid; else r=mid-1; } printf("%lld",l); return 0; }