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
/***********原代码***********/
#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的最大值这里出了问题,但不知道如何修改,求大佬指点