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 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路
  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应