C++:洞穴逃生

洞穴逃生 
描述: 
精灵王子爱好冒险,在一次探险历程中,他进入了一个神秘的山洞。在洞穴深处,精灵王子不小心触动了洞穴内暗藏的机关,整个洞穴将很快塌陷,精灵王子必须尽快逃离洞穴。精灵王子的跑步速度为17m/s,以这样的速度可能是无法逃出洞穴的。庆幸的是精灵王子拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。精灵王子的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。 
现在已知精灵王子的魔法初值M,他所在洞穴中的位置与洞穴出口之间的距离S,距离洞穴塌陷的时间T。你的任务是写一个程序帮助精灵王子计算如何在最短的时间内逃离洞穴。若能逃出,输出"Yes",并输出逃出所用的最短时间;若不能逃出,则输出"No",同时输出精灵王子在剩下的时间内能走的最远距离。注意字母大小写。注意:精灵王子跑步、闪烁或休息活动均以秒(s)为单位。且每次活动的持续时间为整数秒。距离的单位为米(m)。 
注:M、S、T均是大于等于0的整数。由输入保证取值合法性,考生不用检查。 
提醒: 
如果输入的S为0,则说明本身已经在出口,输出应为:Yes 0 
如果输入的T为0(且S不为0),则说明已经没有时间了,输出应为:No 0 
运行时间限制: 无限制 
内存限制: 无限制 
输入: 
输入格式: 



输出: 
输出格式: 
Yes 逃出洞穴所用的最短时间 
或 
No 在洞穴塌陷前能逃跑的最远距离 
样例输入: 
10 
50 

样例输出: 

Yes 1

//首先,M>10,肯定闪烁
//根据y值分为3种,y>=6,2<=y<6和y=1(4s+3s闪烁2次120m/7s>17,距离大于120可以休息)
//最后关头再比较跑步和闪烁的所以时间,剩余距离比较少
#include<iostream>
using namespace std;
int main()
{
	int M,S,T;
	cin>>M>>S>>T;
	int t0=0,t1,t2=0,t=0;
	int s1,s2=0,s3=0;
	int y;
	s1=(M/10)*60;
	t1=M/10;
	y=M%10;  //剩余魔法值
	while(y)
	{
		if(y>=6)
		{
			y=(y+1*4)%10;
			t0=t0+1;
			t1=t1+1;
			s1=s1+60;
		}
		else
			if(y>=2)
			{
				y=(y+2*4)%10;
			    t0=t0+2;
			    t1=t1+1;
			    s1=s1+60;
			}
			else
				if(y=1&&S-s1>=120)
				{
					y=(y+5*4)%10;
					t0=t0+5;
					t1=t1+2;
					s1=s1+2*60;
				}
				else
					break;
	}
	cout<<t0<<endl;
	cout<<t1<<endl;
	if(S-s1-s2>0)
		t2=t2+((S-s1-s2)+16)/17;
	cout<<t2<<endl;
	t=t0+t1+t2;
	cout<<t<<endl;
	if(t<=T)
		cout<<"Yes"<<' '<<t<<endl;
	else           
	{
		//17 240 9,闪烁10S最快,但是时间不够,只能跑
		if(T>=(t0+t1))
			s3=t1*60+(T-t0-t1)*17;
		else  //11 180 7,闪烁最快8s,只能跑
			if(S-(s1-120)>=120&&T<(t0+t1))
				s3=(t1-2)*60+(T-(t1-2)-(t0-5))*17;
			else
				if(T>(M/10))
					s3=((M/10)*60)+(T-(M/10))*17;
				else
					s3=T*60;
		cout<<"No"<<' '<<s3<<endl;
	}
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值