蓝桥杯3——递增三元组

蓝桥杯3——递增三元组_第1张图片

解题思路

本题第一思路是通过三重for循环暴力破解,但是这样存在超时的风险,所以直接排除掉。
后经思考后,我们可以首先通过sort排序对三个数组进行排序,sort是C++库中的排序方法,头文件为algorithm,会根据实际情况选取不同的排序方法,因此选用sort排序对时间复杂度的影响在可控范围内,且会大大缩小后面代码执行的时间。
接下来,我们以B数组的一项为中心,在数组A中寻找比该项小的元素的个数a,在在数组C中寻找比该项小的元素的个数b,将a×b的结果累加,直到B数组每一项均遍历完毕后,即可得出最后结果。
为了进一步优化时间复杂度,我们可以在上一段的步骤中采用二分查找。

解题代码

#include
#include
using namespace std;
int find1(int a[],int goal,int end){
    int left=0;
    int right=end;
    while(left<=right){
        int mid=(left+right)/2;
        if(goal>a[mid]) {
            left=mid+1;
        }else{
            right=mid-1;
        }
    }
    return left;
}
int find2(int a[],int goal,int end){
    int left=0;
    int right=end;
    while(left<=right){
        int mid=(left+right)/2;
        if(goal>=a[mid]) {
            left=mid+1;
        }else{
            right=mid-1;
        }
    }
    return left;
}
int main(){
    int n;
    cin>>n;
    int A[n],B[n],C[n];
    long long ans=0;
    for(int i=0;i<n;i++){
        cin>>A[i];
    }
    for(int i=0;i<n;i++){
        cin>>B[i];
    }    
    for(int i=0;i<n;i++){
        cin>>C[i];
    }
    sort(A,A+n);
    sort(B,B+n);
    sort(C,C+n);
    for(int i=0;i<n;i++){
        long long x=find1(A,B[i],n-1);
        long long y=n-find2(C,B[i],n-1);
        ans+=y*x;
    }
    cout<<ans;
    return 0}

你可能感兴趣的:(蓝桥杯,蓝桥杯,算法,职场和发展)