【OJ练习】守望者的逃离

描述:

恶魔猎手尤迪安野心勃勃.他背叛了暗夜精灵,率深藏在海底的那加企图叛变:守望者在与尤迪安的交锋中遭遇了围杀.被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去,到那时,岛上的所有人都会遇难:守望者的跑步速度,为17m/s,以这样的速度是无法逃离荒岛的。庆幸的是守望者拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。守望者的魔法值恢复的速度为4/s,只有处在原地休息状态时才能恢复。

现在已知守望者的魔法初值M,他所在的初始位置与岛的出口之间的距离S,岛沉没的时间T。你的任务是写一个程序帮助守望者计算如何在最短的时间内逃离荒岛,若不能逃出,则输出守望者在剩下的时间内能走的最远距离。注意:守望者跑步、闪烁或休息活动均以秒(s)为单位。且每次活动的持续时间为整数秒。距离的单位为米(m)

 

提示:

30%的数据满足: 1 <= t<= 10<> 1 <=s<= 100 <> <=s<= 100 <><= t<= 10<>

50%的数据满足: 1 <= t <= 1000<> 1 <= s <= 10000<> <= s <= 10000<><= t <= 1000<>

100%的数据满足: 1 <= t <= 300000<> 0 <= m<=1000 1 <=s <= 10^8 <><= m<=1000 1 <=s <= 10^8 <><= t <= 300000<>

 

实现以下接口:

void HelpWatcherEscape(unsigned int uiMagic, unsigned int uiDistance,

unsigned int uiSecchar *pRstOut, unsigned int *puiMaxDistance)

功能:判断守望者是否能够逃出荒岛

    输入参数:

       unsigned int uiMagic:无符号整型,守望者的初始魔法值

       unsigned int uiDistance:无符号整型,守望者所在的初始位置与岛出口之间的距离。

       unsigned int uiSec:无符号整型,岛沉没需要的时间,单位为秒

输出参数(指针指向的内存区域保证有效):

       char *pRstOut:输出守望者能否逃出荒岛,若能逃出输出“Yes”,不能输出“No”,注意大小写。

unsigned int *puiMaxDistance:若守望者能逃出荒岛,输出逃出荒岛所用的最短时间,不能逃出则输出守望者能逃出的最大距离。

 

思路:

这题可以看成两个人在跑,就看谁跑得快的问题,有几个问题要解决下:
1
、跑的人每秒都在跑
2
、当闪烁的人发现能闪时就闪,并判断此时谁快,如果闪的快,这时候跑的人要和闪烁的人站到一个起跑线上继续跑
3
、每秒都判断是否已经逃离岛

代码:

void HelpWatcherEscape(unsigned int uiMagic, unsigned int uiDistance, unsigned int uiSec,

                                      char *pRstOut, unsigned int *puiMaxDistance)

{

       int DistanceTotal ;

       int People_1_Dis = 0 ;

       int People_2_Dis = 0 ;

       int Sec = uiSec ;

       int Distance = uiDistance ;

       int Time = 1 ;

       int Magic = uiMagic ;

       char Can[4] = "Yes";

       char CanNot[3] = "No";

 

       while ( Time <= Sec )

       {

              People_1_Dis += 17 ;

 

              if ( Magic >= 10 )

              {

                     People_2_Dis += 60 ;

                     Magic -= 10 ;

              }

              else

              {

                     Magic += 4 ;

              }

 

              if ( People_2_Dis > People_1_Dis )

              {

                     People_1_Dis = People_2_Dis ;

                     DistanceTotal = People_2_Dis ;

              }

              else

              {

                     DistanceTotal = People_1_Dis ;

              }

 

              if ( DistanceTotal >= Distance )

              {

                     *pRstOut = Can[0] ;

                     *(pRstOut+1) = Can[1];

                     *(pRstOut+2) = Can[2];

                     *puiMaxDistance = Time ;

                     return ;

              }

              Time++ ;

       }

 

       *pRstOut = CanNot[0] ;

       *(pRstOut+1) = CanNot[1];

       *puiMaxDistance = DistanceTotal ;

       return ;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值