您好,欢迎来到九壹网。
搜索
您的当前位置:首页计蒜客 信息学题库 T1156 查找最接近的元素

计蒜客 信息学题库 T1156 查找最接近的元素

来源:九壹网

题意:
在一个非降序列中,查找与蒜头君的给定值最接近的元素。

条件
1 <= n <= 100,000 (序列元素个数)
1 <= m <= 10,000 (询问次数)
0 <= X i X_i Xi <= 1,000,000,000 (序列元素和给定元素范围)

思路
二分+特判。可以通过lower_bound函数在序列中找到比给定数值大于或者等于的第一个数的下标,从而找到的下标前一个数如果存在那么一定是小于给定数值,由于序列为非降序列,那么最接近给定值的元素一定是第一个大于或者等于该元素的值和小于该元素的最大值中的一个。

AC代码如下:

#include "bits/stdc++.h"
using namespace std;
const int N = 1e5 + 10;
int a[N];
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    int m;
    cin >> m;
    while (m--) {
        int num;
        cin >> num;
        int idx = lower_bound(a, a + n, num) - a;
        int ans;
/// 系列中所有元素都小于给定值,则序列最后一个元素最接近给定值
/// 系列中所有元素都大于或者等于给定值,则序列第一个元素最接近给定值
/// 其他情况为系列中既有大于或者等于给定值的元素,也有小于给定值的元素,
/// 则判定最接近给定值的前一个元素或者后一个元素的距离来确定,距离更小的就是最接近的      
        if (idx == n) ans = a[n - 1]; 
        else if (idx == 0) ans = a[idx]; 
        else if (abs(a[idx - 1] - num) > abs(a[idx] - num)) ans = a[idx]; 
        else ans = a[idx - 1];
        cout << ans << "\n";
    }
    return 0;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务