7-39 龟兔赛跑(C语言数学法)

这题的题面长这样:

乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

输入格式:

输入在一行中给出比赛时间T(分钟)。

输出格式:

在一行中输出比赛的结果:乌龟赢输出@@,兔子赢输出^^,平局则输出-_-;后跟1空格,再输出胜利者跑完的距离。

输入样例:
242

输出样例:
@_@ 726

分析一下题意:乌龟始终以 3m/min 的速度行进,而兔子的行进速度是 9m/min。兔子每次只会连续跑 10min,也就是 90m,如果兔子每次检查发现乌龟落后了,就会连续休息 30min。在这 30min 中乌龟会行进 30min * 3m/min = 90m.

那末从第 0min 开始兔子和乌龟起跑,第 10min 时兔子行进了 90m,乌龟行进了 30m,这时候兔子比乌龟领先于是休息。乌龟和兔子的落差 60m,乌龟需要花 20min 的时间追平,于是在第 30min,乌龟和兔子的行进距离相等,都为 90m.
兔子在第 40min 时醒来,此时乌龟领先兔子 10min * 3m/min = 30m,这段路程差兔子追平需要的时间是 30m/(9m/min-3m/min) = 5min.

那末是不是说在第 45min 的时候龟兔赛跑完成了一个周期呢?注意到兔子在检查到乌龟不落后于自己时会连续跑 10min,在第 45min 时兔子才跑出 5min,也就是说兔子在第 50min 才会停下来看一看乌龟在哪里。

继续推导就能得到这样一张图:
龟兔赛跑
横轴每一小格表示 10min,红线是兔子的行进路程,蓝线是乌龟的行进路程。推导的结果是龟兔赛跑的周期是 90min,每个周期的第0、30、45、60、90min 是乌龟和兔子路程相等的时间点。剩下的事情就是简单的对时间取余和区间判断了。

代码在下面:

#include<stdio.h>

int main(void)
{
  int time;
  scanf("%d", &time);
  getchar();

  if(time%45 == 0 || time%30 == 0) 
  { //平局的情形,这里把对90取余得03060处理成对30取余得0
    printf("-_-");
    printf(" %d", time*3);
  }
  else if( time%90<30 || (time%90<60 && time%90>45) )
  { //兔子赢的区间,赛跑时间过了(time/90)个周期
    printf("^_^");
    if(time%90<10)
      printf(" %d", 270*(time/90)+(time%90)*9 );
      else if(time%90<30) //兔子在睡觉
       printf(" %d", 270*(time/90)+90 );
         else if(time%90<50)
           printf(" %d", 270*(time/90)+135+(time%90-45)*9 );
           else //兔子还是在睡觉
             printf(" %d", 270*(time/90)+180);
  }
  else //乌龟赢的情形,由于乌龟始终匀速行进,路程很好处理
  {
    printf("@_@");
    printf(" %d", time*3);
  }

  return 0;
}

猜你喜欢

转载自blog.csdn.net/asura319/article/details/78697580
今日推荐