7-15 死亡隧道 (10 分)
题目:
小毛驴要回家了,凭借着刚从老毛驴处学到的闪烁魔法,小毛驴信心满满地出发了。这一次它来到了另一条死亡隧道口,但是,小毛驴不知道死亡威胁随时存在,因为它所打算穿过的这条死亡隧道即将于T秒时间后坍塌。
已知小毛驴行走的速度是每秒17米,而小毛驴拥有的闪烁法术可以使它在1秒内移动60米,不过每次使用闪烁法术都会消耗魔法值10点。小毛驴也掌握了魔法恢复技能,但是必须通过原地休息来实现,且魔法值恢复的速度为每秒4点。
已知小毛驴当前的魔法初值为M,死亡隧道的长度为S,隧道将于T秒时间后坍塌。
请你帮助小毛驴计算能否成功穿越隧道,若不能穿过,也请你计算小毛驴在T秒时间内能走的最远距离。
说明: 1)当前小毛驴刚刚踏入隧道口,若在T秒时间内的移动距离大于等于S米的话,就算成功。 2)小毛驴行走、闪烁或者休息均以秒为单位。
输入样例:
4
40 240 4
40 241 4
39 200 4
36 255 10
输出样例:
Yes 4
No 240
No 197
Yes 6
代码:
#include <stdio.h>
#include <stdlib.h>
int n,m,s,t;///魔法初值为M,死亡隧道的长度为S,隧道将于T秒时间后坍塌
int flag=0;
int judge()
{
int dis=0;
int i=1;
for(; i<=t; i++)
{
if(m>=10)//有魔法值,就用
{
dis+=60;
m-=10;
}
else//先判断时间,后判断距离
{
int last_dis=s-dis;//剩余距离
int last_time=t-i+1;//剩余时间
int wait_time=(10-m)/4+1;//等到使用魔法的时间: 回复所用时间+使用魔法的时间
if((10-m)%4!=0)
wait_time+=1;
if(wait_time>last_time)//当剩余时间last_time<等到使用魔法的时间wait_time时,那么步行
dis+=17;
else
{
int walk_time=last_dis/17;//剩余距离步行所用时间
if(last_dis%17!=0)
walk_time+=1;
if(walk_time<=wait_time)//如果在剩余距离里步行走完所用时间比等到使用魔法的时间小,那么久步行
dis+=17;
else//否则 回复能量
m+=4;
}
}
if(dis>=s)
{
flag=1;
break;
}
}
if(flag==1)
return i;//所用时间
else
return dis;//最大距离
}
int main()
{
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d%d%d",&m,&s,&t);
flag=0;
int x=judge();
if(flag==1)
printf("Yes %d\n",x);
else
printf("No %d\n",x);
}
return 0;
}