现在的位置: 首页 > 综合 > 正文

poj3037

2018年04月26日 ⁄ 综合 ⁄ 共 1280字 ⁄ 字号 评论关闭

【题意】

给定一个r*c(r<=100,c<=100)的矩阵,每个元素表示该点高度,给定初始速度v,当从一点移动到另一点后,速度变为原先的2^(该点高度-移动到的点的高度),花费时间是1/原先高度,求从1,1到r,c的最短时间

【输入】

第一行三个数v,r,c

接下来一个r*c的矩阵,意义如上(每个高度在[-25,25])

【输出】

输出一个数表示从1,1到r,c的最短时间,保留两位小数

本来写了个heap+dijkstra,轻松地崩溃了

看了解析发现每个点的速度都是固定的,一遍spfa即可

program poj3037;
const
  zl:array [1..4,1..2] of longint=((0,1),(0,-1),(1,0),(-1,0));
  zero=1e-5;

var
  tot,r,c,i,j,k:longint;
  min,v:extended;
  h:array [0..101,0..101] of longint;
  dis,spd:array [0..101,0..101] of extended;
  x,y:array [0..2000001] of longint;

function quick (a,b:int64):int64;
var
  i:int64;
begin
  if b=0 then exit(1);
  if b=1 then exit(a);
  i:=quick(a,b div 2);
  if b and 1 = 1 then exit(i*i*a)
                 else exit(i*i);
end;

function change (a,b:longint):extended;
begin
  if a<b then exit(1/quick(2,b-a))
         else exit(quick(2,a-b));
end;

begin
  read(v,r,c);
  for i:=1 to r do
    for j:=1 to c do
      read(h[i,j]);
  tot:=0;
  for i:=1 to r do
    for j:=1 to c do
      spd[i,j]:=v*change(h[1,1],h[i,j]);
  for i:=1 to r do
    for j:=1 to c do
      dis[i,j]:=99999999999999999999999999;
  dis[1,1]:=0;
  tot:=1;
  i:=1;
  x[1]:=1;
  y[1]:=1;
  while i<=tot do
    begin
      for k:=1 to 4 do
        if (x[i]+zl[k][1]>=1)and(x[i]+zl[k][1]<=r)
        and(y[i]+zl[k][2]>=1)and(y[i]+zl[k][2]<=c) then
        if dis[x[i],y[i]]+1/spd[x[i],y[i]]<dis[x[i]+zl[k][1],y[i]+zl[k][2]] then
          begin
            dis[x[i]+zl[k][1],y[i]+zl[k][2]]:=dis[x[i],y[i]]+1/spd[x[i],y[i]];
            inc(tot);
            x[tot]:=x[i]+zl[k][1];
            y[tot]:=y[i]+zl[k][2];
          end;
      inc(i);
    end;
  writeln(dis[r,c]:0:2);
end.
【上篇】
【下篇】

抱歉!评论已关闭.