滑雪
Time Limits: 1000 ms Memory Limits: 65536 KB
Description
Bessie和其他一些人去滑雪。Bessie发现她自己站在一块R*C(1<=R,C<=100)的区域中,区域中的每一块都有一个高度值E_ij(-25<=E_ij<=25)。为了参加大家的聚会,Bessie想要尽快到达右下角。Bessie每一步只能向正东,正西,正南,正北前进一步。Bessie以初速度V(1<=V<=1,000,000)前进,她发现了一个她的速度和高度的关系。当Bessie从高度A移动到高度B时,他的速度就乘上了一个数2^(A-B)。Bessie移动一步的速度取决于她在前一格时的速度。
请找出Bessie移动所需的最小时间。
Input
第1行:3个用空格隔开的整数:V,R,C,分别表示Bessie的初速度和区域的长度和宽度
第2 - R+1行:以矩阵的形式表示该区域中各块的高度。
Output
输出一个实数(保留2位小数),表示Bessie达到目的地最少需要的时间。
Sample Input
1 3 3
1 5 3
6 3 5
2 4 3
Sample Output
29.00
Hint
【样例说明】
Bessie的最佳路径是:
(1,1) 时间 0 速度 1
(1,2) 时间 1 速度 1/16
(2,2) 时间 17 速度 1/4
(3,2) 时间 21 速度 1/8
解题思路
bfs,只需要维护最小时间和最大速度就可以了。
然后还有一个非常严重的问题就是答案要先减去
5.5∗10−11
再取绝对值然后取两位小数。
Codes:
const
fx:array[1..4,1..2]of shortint=((1,0),(-1,0),(0,1),(0,-1));
lim=5000000;
var
c:extended;
n,m,i,j,k:longint;
t:array[-50..50]of extended;
h:Array[1..100,1..100]of longint;
value,speed:Array[1..100,1..100]of extended;
data:array[1..lim,1..2]of longint;
procedure work;
var xx,yy,o,l,r,x,y:longint;
v,s,sp,va:extended;
begin
l:=0; r:=1;
data[1,1]:=1; data[1,2]:=1;
value[1,1]:=0; speed[1,1]:=c;
while l<r do
begin
inc(l);
x:=data[l,1]; y:=data[l,2]; sp:=speed[x,y]; va:=value[x,y];
for o:=1 to 4 do
begin
xx:=x+fx[o,1];
yy:=y+fx[o,2];
if (xx<1)or(xx>n) then continue;
if (yy<1)or(yy>m) then continue;
s:=sp*t[h[x,y]-h[xx,yy]];
v:=va+1/sp;
if value[xx,yy]>v then
begin
value[xx,yy]:=v;
if speed[xx,yy]>s then speed[xx,yy]:=s;
inc(r);
data[r,1]:=xx; data[r,2]:=yy;
end;
end;
end;
end;
begin
read(c,n,m);
for i:=1 to n do
for j:=1 to m do read(h[i,j]);
t[0]:=1;
for i:=1 to 50 do
begin
t[i]:=t[i-1]*2;
t[-i]:=t[1-i]/2;
end;
for i:=1 to n do
for j:=1 to m do
begin
value[i,j]:=maxlongint*maxlongint;
speed[i,j]:=value[i,j];
end;
work;
writeln(abs(value[n,m]-5.5e-11):0:2);
end.