列表

详情


BL13. 孙悟空的徒弟

描述

打败魔人布欧以后,孙悟空收了n个徒弟,每个徒弟战斗力各不相同。他教导所有的徒弟和体术,合体后战斗力为原战斗力相乘。任何两个徒弟都可以合体,所以一共有n*(n-1)/2种合体徒弟。有一天,他想考验一下孙悟天战斗力如何,希望在所有n*(n-1)/2种合体徒弟中选择战斗力第k高的,与孙悟天对战。可是孙悟空徒弟太多了,他已然懵逼,于是找到了你,请你帮他找到对的人。

输入描述

第一行两个int。徒弟数量:n <= 1*10^6;战斗力排名:k <= n*(n-1)/2
第二行空格分隔n个int,表示每个徒弟的战斗力。

输出描述

战斗力排名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;
}

上一题