wxcbsd123 2023-05-20 09:44 采纳率: 87.5%
浏览 46

二分查找最接近的数值m,程序无法运行,有输入没有输出

01:查找最接近的元素
查看提交统计提问
总时间限制: 1000ms 内存限制: 65536kB
描述
在一个非降序列中,查找与给定值最接近的元素。

输入
第一行包含一个整数n,为非降序列长度。1 <= n <= 100000。
第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。
第三行包含一个整数m,为要询问的给定值个数。1 <= m <= 10000。
接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。
输出
m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。

程序没有输出。


#include<bits/stdc++.h>
using namespace std;
const int MAXN=100000+5;
int a[MAXN],r[MAXN];
int compare(int m1,int n1,int x1){
    if(m1-x1>n1-x1) return n1;
    else return m1;
}
void msort(int s,int t){
    if(s==t) return;
    int mid=(s+t)/2;
    msort(s,mid);
    msort(mid+1,t);
    int i=s,j=mid+1,k=s;
    while(i<=mid&&j<=s){
        if(a[i]<a[j]){
            r[k]=a[j];j++;k++;
        }
        else{
            r[k]=a[i];i++;k++;
        }
    }
    while(i<=mid){
        r[k]=a[i];i++;k++;
    }
    while(j<=s){
        r[k]=a[j];j++;k++;
    }
     for(i=s;i<=t;i++) a[i]=r[i];
}
int DFind(int s,int t,int m2){
    int mid=(s+t)/2;
    if(a[s]<m2&&a[t]>m2) return compare(a[s],a[t],m2);
    if(a[mid]==m2) return a[mid];
    if(a[mid]<m2) return DFind(s,mid,m2);
    else return DFind(mid+1,t,m2); 
}

int main(){
    int n,mn,m[10005];
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    cin>>mn;
    for(int i=0;i<mn;i++){
        cin>>m[i];
    }
    for(int i=0;i<mn;i++){
        cout<<DFind(0,n,m[i]);
    }
    return 0;

}
  • 写回答

3条回答 默认 最新

  • P2441M 2023-05-20 10:28
    关注
    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int main()
    {
        int n, m;
        cin >> n;
        int *numbers = new int[n];
        for (int i = 0; i < n; i++) cin >> numbers[i];
        cin >> m;
        while (m--)
        {
            int x;
            cin >> x;
            int left = 0, right = n - 1;
            while (left < right)
            {
                int mid = (left + right) / 2;
                if (numbers[mid] >= x) right = mid;
                else left = mid + 1;
            }
            if (left == 0) cout << numbers[0] << endl;
            else if (left == n - 1) cout << numbers[n - 1] << endl;
            else if (abs(numbers[left] - x) < abs(numbers[left - 1] - x)) cout << numbers[left] << endl;
            else cout << numbers[left - 1] << endl;
        }
        return 0;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 5月20日

悬赏问题

  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。
  • ¥20 在easyX库下编写C语言扑克游戏跑的快,能实现简单的人机对战