CCF NOI1044. 最近元素 (C++)

版权声明:代码属于原创,转载请联系作者并注明出处。 https://blog.csdn.net/weixin_43379056/article/details/84952438

1044. 最近元素

题目描述

在一个非降序列中,查找与给定值最接近的元素。

输入

第一行包含一个整数n,为非降序列长度。1 <= n <= 100000。

第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。

第三行包含一个整数m,为要询问的给定值个数。1 <= m <= 10000。

接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。

输出

m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。

样例输入

3
2 5 8
2
10
5

样例输出

8
5

数据范围限制

1 <= n <= 100000。

C++代码

#include <iostream>
#include <cassert>
#include <algorithm>

using namespace std;

const int N = 100000; // maximum n
const int M = 10000;  // maximum m
const int MAX_NUM = 1000000000; // maximum number

int cmp(const void *v1, const void *v2)
{
    return int(*((long long *)v1) - *((long long *)v2)); // sort ascending
}

long long search(long long myArray[],int size,long long num)
{
    int start,end,mid;

    start = 0;
    end   = size - 1;
    mid   = (start+end)/2;

    if(myArray[start] > num)
    {
        return myArray[start];
    }
    else if (myArray[end] < num)
    {
        return myArray[end];
    }

    while(start <= end)
    {
        if(myArray[mid] > num)
        {
            end = mid-1;
            mid = (start+end)/2;
            continue;
        }
        if(myArray[mid] < num)
        {
            start = mid+1;
            mid = (start+end)/2;
            continue;
        }
        break;
    }

    if ((myArray[mid+1]-num) >= (num-myArray[mid]))
    {
        return myArray[mid];
    }
    else
    {
        return myArray[mid+1];
    }
}
    
int main()
{
    int n;

    cin >> n;

    assert(1 <= n && n <= N);

    long long nIntArray[N];

    for(int i=1; i<=n; i++)
    {
        cin >> nIntArray[i-1];

        assert(0 <= nIntArray[i-1] && nIntArray[i-1] <= MAX_NUM);
    }

    // sort ascending
    qsort(nIntArray, n, sizeof(long long), cmp);

    int m;

    cin >> m;

    assert(1 <= m && m <= M);

    long long mIntArray[M];

    for(int i=1; i<=m; i++)
    {
        cin >> mIntArray[i-1];
    }

    for(int i=1; i<=m; i++)
    {
        cout << search(nIntArray, n, mIntArray[i-1]) << endl;    
    }

    return 0;

猜你喜欢

转载自blog.csdn.net/weixin_43379056/article/details/84952438