2015华为机试题:洞穴逃生

洞穴逃生 
描述: 
精灵王子爱好冒险,在一次探险历程中,他进入了一个神秘的山洞。在洞穴深处,精灵王子不小心触动了洞穴内暗藏的机关,整个洞穴将很快塌陷,精灵王子必须尽快逃离洞穴。精灵王子的跑步速度为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

下面是程序代码,可能有问题,但还没发现。

// 贪婪算法-精灵王子.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;

int M, S, T;//初始魔法值、据洞口距离、洞口塌陷时间
int mintime,maxdistance;
void dfs(int distance, int time, int m)//目前已走距离、已用时间、魔法值
{
    if (time >T)
	{
		maxdistance = distance;// 
		return;
	}
	else if (time == T)
	{
		if (distance >= S)  mintime = time; maxdistance = distance;
		return;
	}

   else if (distance >= S)
	{
		mintime = time;// 
		maxdistance = distance;
		return;
	}
   if (m >= 10)//优先用魔法
	{
		distance = distance + 60;
		time = time + 1;
		m = m - 10;
		dfs(distance, time, m);
	}
	else if ((time + (10 - m) / 4)<T && ((10 - m) / 4*17)<=60)//原地等待
	{
		time = time + 1;
		m = m + 4;
		dfs(distance, time ,m );

	}
	else//跑步
	{
		distance = distance + 17;
		time = time + 1;
		dfs(distance , time , m);
	}
	
}
int main(int argc, _TCHAR* argv[])
{
	while (cin >> M >> S >> T)
	{
		if (S== 0)
		{
			cout << "YES" << 0 << endl;
			continue;
		}
		else if (T== 0 && S != 0)
		{
			cout << "NO" << 0 << endl;
			continue;
		}
		dfs(0, 0, M);
		if (mintime <= T && maxdistance>=S)
		{
			cout << "YES" << " " << mintime << endl;
		}
		else
			cout << "NO" << " " << maxdistance << endl;
	}
	return 0;
}


你可能感兴趣的:(2015华为机试题:洞穴逃生)