滑雪

滑雪


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.51011 再取绝对值然后取两位小数。

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值