kk_阿白 2021-11-20 22:14 采纳率: 20%
浏览 64
已结题

#C语言如何优化二分搜索

2856: 小A的游戏制作系列一
题目描述
小A同学最近参加了一个GameJam,与组队小伙伴一起在48小时内开发一个小游戏。小A接到这样的一个需求:
在数据库中存放N份奖励,每份奖励的ID为a_i。玩家领取任务并完成,会获得一个数字k,在提交任务时,系统根据这个数字在数据库里查找小于等于k的最大ID,发放给玩家对应ID的奖励。如果没有这样一个ID,将发放ID最大的一个奖励给玩家。
现在游戏开发完成了,需要进程测试,测试同学计划使用M个样例进行测试。发现小A写的代码出了bug,希望你能帮小A重新写一份代码。
输入
第一行输入一个整数N,M,代表奖励的个数和测试同学的测试样例个数。(1<=N,M<=1e6)
接下来N个整数a_i,分别代表奖励的ID。大小为int范围内
接下来M行,每行一个整数,代表测试同学的一个测试样例。大小为int范围内
输出
输出每个测试样例的测试结果ID

img


/***********原代码***********/
#include<stdio.h>
#include<math.h>
int Found(int str[],int n,int num);
int main()
{
    int T,a[100001],i,k,num,m,an,j,temp;
    scanf("%d%d",&T,&m);
    for(i=0; i<T; i++)
        scanf("%d",&a[i]);
    //进行排序(如果T值等于1,排序会越界)
    if(T!=1)
    {
        for(i=0; i<T-1; i++)
            for(j=i+1; j<T; j++)
            {
                if(a[i]>a[j])
                {
                    temp=a[i];
                    a[i]=a[j];
                    a[j]=temp;
                }
            }
    }
    for(i=0; i<m; i++)
    {
        scanf("%d",&num);
        //ID唯一,直接输出ID
        if(T==1)
        {
            printf("%d\n",a[0]);
            continue;
        }
        //如果查找值小于最小ID
        if(num<a[0])
            an=a[T-1];
        //如果查找值在ID范围内
        else if(num>=a[0]&&num=<a[T-1])
            an=Found(a,T,num);
        //如果查找值大于最大ID
        else
            an=a[T-1];
        printf("%d\n",an);
    }
    return 0;
}
int Found(int str[],int n,int num)
{
//因为是三个数比较,所以以下情况单独考虑
    if(num>=str[0]&&num<str[1])
        return str[0];
    if(num>=str[n-2]&&num<str[n-1])
        return str[n-2];
/***********************************/       
   int mid,max=n-1,min=0,a=1,b=0,c=0,T;
//二分查找离所给值最近的值
    while(a>b||a>c)
    {
        mid=(min+max)/2;
        a=fabs(str[mid]-num);
        b=fabs(str[mid-1]-num);
        c=fabs(str[mid+1]-num);
        T=str[mid];
//保证ID奖励为小于等于所给值的最大值
        if(str[mid]>str[mid-1]&&num<str[mid])
            T=str[mid-1];
        if(num<str[mid])
        {
            max=mid-1;
            continue;
        }
        else if(num>str[mid])
        {
            min=mid+1;
            continue;
        }
    }
    return T;
}

提交上去显示时间超限,我觉得应该是寻找小于等于k的最大值这里出了问题,但不知道如何修改,求大佬指点

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 11月28日
    • 创建了问题 11月20日

    悬赏问题

    • ¥15 使用百度地图api 位置函数报错?
    • ¥15 metamask如何添加TRON自定义网络
    • ¥66 关于川崎机器人调速问题
    • ¥15 winFrom界面无法打开
    • ¥30 crossover21 ARM64版本安装软件问题
    • ¥15 mymetaobjecthandler没有进入
    • ¥15 mmo能不能做客户端怪物
    • ¥15 osm下载到arcgis出错
    • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
    • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。