[code] /************************* 守望者的逃离 *【问题描述】恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图 *叛变。守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。为了杀死守望者, *尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会遇难。守 *望者的跑步速度为17m/s,以这样的速度是无法逃离荒岛的。庆幸的是守望者拥有闪烁法术, *可在1s 内移动60m,不过每次使用闪烁法术都会消耗魔法值10 点。守望者的魔法值恢复的 *速度为4 点/s,只有处在原地休息状态时才能恢复。 *现在已知守望者的魔法初值M,他所在的初始位置与岛的出口之间的距离S,岛沉没的 *时间T。你的任务是写一个程序帮助守望者计算如何在最短的时间内逃离荒岛,若不能逃出, *则输出守望者在剩下的时间内能走的最远距离。注意:守望者跑步、闪烁或休息活动均以秒 *(s)为单位,且每次活动的持续时间为整数秒。距离的单位为米(m)。 *【文件输入】 *输入文件仅一行,包括空格隔开的三个非负整数M, S, T。 *【文件输出】 *输出文件包含两行: *第1 行为字符串“Yes”或“No”(区分大小写),即守望者是否能逃离荒岛。 *第2 行包含一个整数。第一行为“Yes”(区分大小写)时表示守望者逃离荒岛的最短 *时间;第一行为“No”(区分大小写)时表示守望者能走的最远距离。 *【样例输入1】 *39 200 4 *【样例输出1】 *No *197 *【样例输入2】 *36 255 10 *【样例输出2】 *Yes *6 *输入文件17.in *输出文件17.out **************************/ #include #include using namespace std;

int main() { ifstream ist(“17.in”); ofstream ost(“17.out”); if(!ist || !ost) { cout « “Cannot open the file.” « endl; return 1; }

int M = 0;		//魔法值
int S = 0;		//与岛的出口之间的距离
int T = 0;		//剩余时间

ist >> M >> S >> T;

int V = 17;			//守望者的跑步速度
int Vmagic = 60;	//使用闪烁法术跑步速度
int Vrecover = 4;	//魔法值恢复的速度
int Sed = 0;		//已经走的距离
int Tleft = T;		//剩余时间

while(M >= 10 && T > 0 && S - Sed > 0)		//魔法初值大于10,可以立即使用闪烁魔法
{
	if(S - Sed > 17)
	{
		Sed += Vmagic;
        M -= 10;
        T--;
	}
     else
		 ost << "Yes" << endl << Tleft-T+1;
 }
 while(T > 0 && S - Sed > 0)				//魔法初值小于10,要停下休息
 {
     if((M == 0 || M == 1) && T >= 7 && S - Sed > (6 * V)) //魔法值为0或1
     {
		 T -= 7;
		 Sed += (2 * Vmagic);
	 }
     else if(M >= 2 && M <= 5 && T >= 3 && S - Sed > (2 * V))	//魔法值在2到5之间
     {
		 M -= 2;
		 T -= 3;
		 Sed += Vmagic;
	 }
		 else if(M >= 6 && T >= 2 && S - Sed > V)		//魔法值大于6
		 {
			 M -= 6;
			 T -= 2;
			 Sed += Vmagic;
		 }
			 else						//时间小于等于1
			 {
				 Sed += V;
				 T--;
			 }
 }

if(S <= Sed)		//已经走的距离大于与岛的出口之间的距离
	ost << "Yes" << endl << (Tleft-T);
else
	ost << "No" << endl << Sed;

return 0; } [/code]