pascal 守望者的逃离,看一下我的程序哪错了。谢谢了 有的数据结果好像走得远了。

恶魔猎手尤迫安野心勃勃.他背叛了暗夜精灵,率深藏在海底的那加企图叛变:守望者在与尤迪安的交锋中遭遇了围杀.被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去,到那时,刀上的所有人都会遇难:守望者的跑步速度,为17m/s, 以这样的速度是无法逃离荒岛的。庆幸的是守望者拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。守望者的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。
现在已知守望者的魔法初值M,他所在的初始位置与岛的出口之间的距离S,岛沉没的时间T。你的任务是写一个程序帮助守望者计算如何在最短的时间内逃离荒岛,若不能逃出,则输出守望者在剩下的时间内能走的最远距离。注意:守望者跑步、闪烁或休息活动均以秒(s)为单位。且每次活动的持续时间为整数秒。距离的单位为米(m)。

var
m,s,t,y,i,j,x:integer;
begin
read(m,s,t);
x:=(m div 10)*60;
y:=m div 10;
m:=m mod 10;
while (y<t)and(x<s)do
if(m>=6)and(t-y>=2) then {当蓝>=6,剩余时间大于等于2时,闪}
begin
m:=m-6;
x:=x+60;
y:=y+2;
end else
if (m>=2)and(t-y>=3) then {当蓝大于等于2,剩余时间大于等于3时,闪}
begin
m:=m-2;
x:=x+60;
y:=y+3;
end else
if t-y>=7 then {当剩余时间大于等于7时,闪}
begin
x:=x+120;
y:=y+7;
end else {否则,一直走}
begin
x:=x+17;
y:=y+1;
end;
if x>=s then
begin
writeln('Yes');
write(y);
end else
begin
writeln('No');
write(x);
end;
end.

这个题目贪心或者DP都是可以的,看样子你是用的网上最常见的贪心模型
可能漏掉了某种情况(表示分情况的贪心最容易出错)
我没仔细看,但是好像觉得你有可能透支了未来的魔法。
我有时间再帮你考虑考虑,下附我的贪心程序
program p1024;
var
m:integer;
t,s,l1,l2,i:longint;
begin
readln(m,s,t);
for i:=1 to t do
begin
if m>=10 then
begin
l1:=l1+60;
m:=m-10;
end
else m:=m+4;
if l2+17>l1 then
l2:=l2+17
else l2:=l1;
if l2>=s then
begin
writeln('Yes');
writeln(i);
halt;
end;
end;
writeln('No');
writeln(l2);
end.
这种问题的思路一般都是双线操作(我的l1,l2)
要提交的话tyvj上有,这里也有
http://58.51.82.174/JudgeOnline/showproblem?problem_id=1024
类似的问题还有又上锁妖塔
http://58.51.82.174/JudgeOnline/showproblem?problem_id=1097
其实dollars也是双线操作
http://58.51.82.174/JudgeOnline/showproblem?problem_id=1108
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-12-19
好题!
其实,每闪烁一次要2.5秒,60米除以2.5秒等于24米/秒。大于17米每秒。所以尽可能的闪烁。到最后,如果凑不足一次闪烁就跑路。所以逃跑策略如下:
1、一开始就用闪烁(好像没有魔法使用时间),用到没有魔。
2、用光魔之后,就停留不动,直到有魔法来使用闪烁为止,立刻使用闪烁。
3、快到岸边时(最后的4秒不到的时间内,如果没有足够的时间恢复魔法使用闪烁时就尽力跑吧!(跑步对身体好)
4、成败在于第3,如果还是没有到,就死掉算了,如果到了,就成功了。
编程的话就太长了,我就犯懒不写了。本回答被网友采纳
第2个回答  2010-12-19
魔兽爱好者路过- -
相似回答