[Tyvj1108 守望者的逃离]

[题目来源]:NOIP2007普及组

[关键字]:贪心

[题目大意]:守望者的跑步速度为17m/s,守望者拥有闪烁法术,可在1s内移动60m,每次使用闪烁法术都会消耗魔法值10点。守望者的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。现在已知守望者的魔法初值M,他所在的初始位置与岛的出口之间的距离S,岛沉没的时间T。计算如何在最短的时间内逃离荒岛,若不能逃出,则输出守望者在剩下的时间能走的最远距离。

//======================================================================

[分析]:AC做法是贪心。易证闪烁最然需要回魔,但闪烁之后一定走的比跑要远,所以只要有魔就闪,没魔就回魔。注意到最后时,如果没时间进行下一次回魔加闪烁就要跑。还有如果到最后时,如果跑到终点的时间和进行下一次回魔加闪烁时间一样,要判断哪个更远:因为会磨时间+闪烁时间只有3s或4s两种可能,但是其中17*4=68,但闪烁只有60.

[代码]:

View Code
 1 program Project1;
2 var
3 m, s, t: longint;
4
5 procedure work;
6 var
7 ma, wt, ws, temp, t1: longint;
8 begin
9 ma := m;
10 ws := 0;
11 wt := 0;
12 while (ws < s) and (wt < t) do
13 begin
14 inc(wt);
15 if ma >= 10 then
16 begin
17 inc(ws,60);
18 dec(ma,10);
19 //writeln(wt,' k ',ws);
20 continue;
21 end;
22 if ma < 10 then
23 begin
24 temp := 10-ma;
25 if temp mod 4 = 0 then temp := temp div 4 else temp := temp div 4+1;
26 if t-wt+1 < temp+1 then
27 begin
28 inc(ws,17);
29 continue;
30 end;
31 t1 := s-ws;
32 if t1 mod 17 = 0 then t1 := t1 div 17 else t1 := t1 div 17+1;
33 if t1 = temp+1 then
34 if s-ws > 60 then
35 begin
36 inc(ws,17);
37 continue;
38 end;
39 if t1 < temp+1 then
40 begin
41 inc(ws,17);
42 continue;
43 end;
44 inc(ma,4);
45 //writeln(wt,' l ',ws);
46 end;
47 end;
48 if ws >= s then
49 begin
50 writeln('Yes');
51 writeln(wt);
52 end
53 else
54 begin
55 writeln('No');
56 writeln(ws);
57 end;
58 end;
59
60 begin
61 assign(input,'d:\1.in');reset(input);
62 assign(output,'d:\1.out');rewrite(output);
63 readln(m,s,t);
64 work;
65 close(input);
66 close(output);
67 end.

 

 

你可能感兴趣的:(T)