1 条题解

  • 0
    @ 2024-10-16 23:28:43

    注意upper_bound()返回的是第一个大于查找元素的下标,那么该下标减一就是第一个小于等于元素的下标咯


    5
    大师,我悟了

    STL写法(vector)

    #include<bits/stdc++.h>
    #define ULL unsigned long long
    #define LL long long
    #define endl '\n'
    #define debug(a) cout<<#a<<"="<<a<<endl;
    #define PII pair<int,int>
    using namespace std;
    const int N =  1 *1e7 + 10,M = 5 * 1e3 + 10,inf = 0x3f3f3f3f;
    
    int n,m;
    int find1(int x,vector<int> a) //返回第一个大于等于x的数组下标
    {
        return lower_bound(a.begin(),a.end(),x) - a.begin();
    }
    int find2(int x,vector<int> a) //返回第一个大于x的数组下标
    {
        return upper_bound(a.begin(),a.end(),x) - a.begin();
    }
    void solve()
    {
        cin>>n;
        vector<int> arr(n);
        for(int i=0;i<n;i++) cin>>arr[i];
        cin>>m;
        while (m--)
        {
            int x;
            cin>>x;
            if(x <= arr[0]) cout<<arr[0]<<endl;
            else if(x >= arr[n-1]) cout<<arr[n-1]<<endl;
            else
            {
                int i = find1(x,arr) , j = find2(x,arr);
                int ans = abs(x - arr[i]) < abs(arr[j-1] - x) ? arr[i] : arr[j-1];
                cout<<ans<<endl;
            }
    
            
        }
    }
    int main()
    {
        ios::sync_with_stdio(0);cin.tie(nullptr),cout.tie(0);
        int _=1;
        // cin>>_;
        while(_--)
        {
            solve();
        }
        return 0;
    }
    
    /**
     *    author: Nijika_jia
     *    created: 2024.10.13 12:02:03
     */
    

    STL(常规数组)

    #include<bits/stdc++.h>
    #define ULL unsigned long long
    #define LL long long
    #define endl '\n'
    #define debug(a) cout<<#a<<"="<<a<<endl;
    #define PII pair<int,int>
    using namespace std;
    const int N =  1 *1e7 + 10,M = 5 * 1e3 + 10,inf = 0x3f3f3f3f;
    
    int n,m;
    int arr[N];
    int find1(int x,int a[]) //返回第一个大于等于x的数组下标
    {
        return lower_bound(a,a+n,x) - a;
    }
    int find2(int x,int a[]) //返回第一个大于x的数组下标
    {
        return upper_bound(a,a+n,x) - a;
    }
    void solve()
    {
        cin>>n;
        for(int i=0;i<n;i++) cin>>arr[i];
        cin>>m;
        while (m--)
        {
            int x;
            cin>>x;
            if(x <= arr[0]) cout<<arr[0]<<endl;
            else if(x >= arr[n-1]) cout<<arr[n-1]<<endl;
            else
            {
                int i = find1(x,arr) , j = find2(x,arr);
                int ans = abs(x - arr[i]) < abs(arr[j-1] - x) ? arr[i] : arr[j-1];
                cout<<ans<<endl;
            }
    
            
        }
    }
    int main()
    {
        ios::sync_with_stdio(0);cin.tie(nullptr),cout.tie(0);
        int _=1;
        // cin>>_;
        while(_--)
        {
            solve();
        }
        return 0;
    }
    
    /**
     *    author: Nijika_jia
     *    created: 2024.10.12 23:02:03
     */
    
    • 1

    信息

    ID
    626
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    21
    已通过
    3
    上传者