计蒜客 信息学题库 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;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值