每日刷题(四十)
BASIC-24、龟兔赛跑预测
这题看起来很简单,但是考验的也是逻辑思维能力。
这里有以下需要考虑的:
- 在兔子领先乌龟t米前兔子就已经超过了乌龟
- 兔子超过乌龟后在逗留的s秒内需要循环遍历乌龟走的路程,不能直接加上s,因为存在一种情况在s秒内乌龟赶超了兔子并且走到了终点
- 当乌龟走完s秒内兔子也要开始走,如果之后兔子又领先乌龟t米,需要考虑一种标识flag用来激活停留或取消停留,re用于在重新开始跑后在已走过的v1路程上+= re*v1
详细C代码如下:
#include<stdio.h>
int main()
{
int v1, v2, t, s, l;
scanf("%d %d %d %d %d", &v1, &v2, &t, &s, &l);
int s1 = 0, s2 = 0, t1 = 0, t2 = 0;
int td = 1;
int tmp = 0;
int flag = 0; //休息的标识
int re = 0;
int c = 0;
int ac = 0; //兔子逗留标识
while(1)
{
if(v1 * td >= l && flag == 0 && re == 0) //还没到t米就兔子就到达了终点
{
printf("R\n%d", td);
break;
}
if(flag == 0 && re == 0 && c == 0) //兔子停下之前的路程公式
s1 = v1 * td;
else if(re != 0 && flag == 0)
{
s1 += v1 * re;
}
s2 = v2 * td;
if(s1 >= l && s2 < l) //兔子超过乌龟到达终点
{
printf("R\n%d", td);
break;
}
if(flag == 1 && tmp + s == td)
{
flag = 0; //失活
re = 1;
}
if(s2 >= l && s1 < l) //乌龟超过兔子到达终点
{
printf("T\n%d", td);
break;
}
if(s2 == l && s1 == l) //二者同时到达终点
{
printf("D\n%d", td);
break;
}
if(s1 - s2 >= t && flag == 0) //兔子领先乌龟t米
{
flag = 1;
tmp = td; //标尺
c = 1;
}
td++;
}
return 0;
}
部分运行结果如下: