第二题 我在百度搜到的 你看下对不对 常

 
 
#include<stdio.h>
/*m,s,t分别代表初始魔法值、距离、时间
*psT和*pDist用作传出参数,*pDist用来返回最远能跑的距离,如果能够跑出来
则它一定大于等于s。如果能够跑出来,*psT返回跑出来的最短时间*/
void Escape ( int m , int s , int t , int * psT , int * pDist )
{
if ( t <= 0 && s > 0 )
{
* pDist = 0 ;
return ;
}
if ( s <= 0 )
{
* psT = 0 ;
return ;
}
int sT1 = 0 , sT2 = 0 , Dist1 = 0 , Dist2 = 0 ;
if ( m >= 10 && s > 60 )
{
* psT = 1 ;
* pDist = 60 ;
Escape ( m - 10 , t - 1 , s - 60 , & sT1 , & Dist1 );
}
if ( m >= 10 && s <= 60 )
{
* psT = 1 ;
* pDist = s ;
}
/*这里是最基本的情况,但里面有几种情况,需要细分*/
if ( m < 10 && s <= 60 )
{
int RecoverT ; //魔法恢复到10以上的时间
if ( m < 2 )
RecoverT = 1000000 ;
if ( m >= 2 && m < 6 )
RecoverT = 2 ;
if ( m >= 6 && m <= 9 )
RecoverT = 1 ;
if ( t * 17 >= s || RecoverT + 1 <= t ) //满足这一条件则能够逃出去
{
* pDist = s ;
if ( s <= 17 )
* psT = 1 ;
else if ( s > 17 && s <= 34 )
* psT = 2 ;
else if ( s > 34 && s <= 51 )
{
if ( RecoverT == 1 )
* psT = 2 ;
else
* psT = 3 ;
}
else if ( s >= 51 )
{
if ( RecoverT > 10 )
* psT = 4 ;
else
* psT = RecoverT + 1 ;
}
}
else //如果逃不出去,只需算pdist,
{
* pDist = t * 17 ;
}
}
if ( m < 10 && s > 60 )
{
if ( m <= 1 )
{
if ( s >= 120 ) //只要距离大于120m,则前120m用两次魔法是最快的(7s)
{ //如果用奔跑则7s只能跑119m
if ( t >= 7 ) //有足够时间用两次魔法,有机会逃出去,可以化简到其它情况
{
* psT = 7 ;
* pDist = 120 ;
Escape ( m , s - 120 , t - 7 , & sT2 , & Dist2 );
}
else //t < 7,一定逃不出去了
{
* pDist = 17 * t ;
}
}
else //小于120m,那么采用奔跑更快,可以递归到简单情况
{
* psT = 1 ;
* pDist = 17 ;
Escape ( m , s - 17 , t - 1 , & sT2 , & Dist2 );
}
}
else if ( m >= 2 && m < 6 ) //只需两秒可以有超过十个魔力,用魔法3s可以跑60m,因此用掉魔法再说
{
if ( t >= 3 ) //有机会用一次魔法,并且可以递归到其它情况
{
* pDist = 60 ;
* psT = 3 ;
Escape ( m - 2 , s - 60 , t - 3 , & sT2 , & Dist2 );
}
else //(t < 3) 跑不出去,用不了魔法,只需计算最远能跑的距离
{
* pDist = 17 * t ;
}
}
else // m >= 6
{
if ( t >= 2 ) //有机会用一次魔法,可以递归到其它情况
{
* pDist = 60 ;
* psT = 2 ;
Escape ( m - 6 , s - 60 , t - 2 , & sT2 , & Dist2 );
}
else //没机会用魔法,逃不出去,只需计算最远能跑的距离
{
* pDist = t * 17 ;
}
}
}
* psT = * psT + sT1 + sT2 ; //将每个阶段所花的时间加起来
* pDist = * pDist + Dist1 + Dist2 ; //每个阶段跑的距离加起来
}
int main ()
{
int s , t , m ;
int sT = 0 , Dist = 0 ;
scanf ( "%d %d %d" , & m , & s , & t );
Escape ( m , s , t , & sT , & Dist );
if ( Dist < s )
printf ( "No %d" , Dist );
else
printf ( "Yes %d" , sT );
return 0 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值