An葡萄汽水 2023-01-14 22:35 采纳率: 100%
浏览 34
已结题

错误提示:Time Limit Exceeded.希望指出如何修改代码可以通过测试

ACM题目,
错误提示:Time Limit Exceeded.
希望指出如何修改代码可以通过测试

img

img

  • 写回答

4条回答 默认 最新

  • 关注

    在二分法查找的时候,在else部分,不能直接break。需要继续向左查找。举个例子来说,输入的所有数据是10000个3,在找3的时候,你的代码在找到5000这个位置的时候就结束while循环了,后面还需要从0到5000遍历,仍然比较耗时。所以,在else部分,仍然需要按照二分法向左查找,以提升查找效率。
    代码测试通过。

    img

    代码修改如下(我把你代码中的m和n的位置调整了):

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int m=0,n=0,i=0,j=0,ret;
        int low,high,mid;
        scanf("%d%d",&n,&m);
        long* arr=(long*)malloc(sizeof(long)*n); //所有的数
        long* brr=(long*)malloc(sizeof(long)*m);//待询问的数
        for(i=0;i<n;i++)
            scanf("%ld",&arr[i]);
        for(i=0;i<m;i++)
            scanf("%ld",&brr[i]);
    
        //遍历所有待询问的数
        for(i=0;i<m;i++)
        {
            //二分法查找
            low = 0;
            high = n-1;
            mid = (low+high)/2;
            ret = -1;
            while(low<=high)
            {
                if(brr[i]<arr[mid])
                    high = mid-1;
                else if(brr[i]>arr[mid])
                    low = mid+1;
                else
                {
                    ret = mid;
                    high = mid-1;//继续向左找
                }
                mid = (low+high)/2;
            }
            if(ret != -1)
                printf("%d",ret+1);
            else
                printf("-1");
            if(i<n-1)
                printf(" "); //空格
        }
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 1月23日
  • 已采纳回答 1月15日
  • 创建了问题 1月14日

悬赏问题

  • ¥15 对于知识的学以致用的解释
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败