2433: [Noi2011]智能車比賽 - BZOJ

Description

 新一屆智能車大賽在JL大學開始啦!比賽賽道能夠看做是由n個矩形區域拼接而成(以下圖所示),每一個矩形的邊都平行於座標軸,第i個矩形區域的左下角和右上角座標分別爲(xi,1,yi,1)和(xi,2,yi,2)。

題目保證:xi,1<xi,2=xi+1,1,且yi,1< yi,2,相鄰兩個矩形必定有重疊在一塊兒的邊(如圖中虛線所示),智能車能夠經過這部分穿梭於矩形區域之間。




選手們須要在最快的時間內讓本身設計的智能車從一個給定的起點S點到達一個給定的終點T點,且智能車不能跑出賽道。假定智能車的速度恆爲v且轉向不消耗任什麼時候間,你能算出最快須要多少時間完成比賽麼?
Input

 輸入的第一行包含一個正整數n,表示組成賽道的矩形個數。

接下來n行描述這些矩形,其中第i行包含4個整數xi,1, yi,1, xi,2, yi,2,表示第i個矩形左下角和右上角座標分別爲(xi,1, yi,1)和(xi,2, yi,2)。

接下來一行包含兩個整數xS, yS,表示起點座標。

接下來一行包含兩個整數xT, yT,表示終點座標。

接下來一行包含一個實數v,表示智能車的速度。
Output

 僅輸出一個實數,至少精確到小數點後第六位,爲智能車完成比賽的最快時間。

對於每一個測試點,若是你的輸出結果和參考結果相差不超過10^-6,該測試點得滿分,不然不得分。
Sample Input
2

1 12 2

203 4

1 1

30

1.0



Sample Output
2.41421356
HINT

有精度偏差,請不要提交


N<=2000,所輸入數字爲絕對值小於40000的整數ide

 

囧,實際上是一道比較簡單的dp,一直犯了一個sb錯誤,沒有好好地更新視野,我只用了視野中的點更新視野,操蛋測試

咱們能夠從左到右dp,判斷是否能夠到達,而後更新ans,這個咱們只要記錄兩個點,一個是視野的上界,一個是視野的下界,而後沒有視野就break,很是快spa

  1 const
  2     maxn=2020;
  3     inf=99999999999999;
  4 type
  5     point=record
  6         x,y:longint;
  7     end;
  8  
  9 function max(x,y:longint):longint;
 10 begin
 11     if x>y then exit(x);
 12     exit(y);
 13 end;
 14  
 15 function min(x,y:longint):longint;
 16 begin
 17     if x<y then exit(x);
 18     exit(y);
 19 end;
 20  
 21 function min(x,y:double):double;
 22 begin
 23     if x<y then exit(x);
 24     exit(y);
 25 end;
 26  
 27 function max(x,y:double):double;
 28 begin
 29     if x>y then exit(x);
 30     exit(y);
 31 end;
 32  
 33 procedure swap(var x,y:point);
 34 var
 35     t:point;
 36 begin
 37     t:=x;x:=y;y:=t;
 38 end;
 39  
 40 operator -(a,b:point)c:point;
 41 begin
 42     c.x:=a.x-b.x;
 43     c.y:=a.y-b.y;
 44 end;
 45  
 46 operator *(a,b:point)c:longint;
 47 begin
 48     exit(a.x*b.y-a.y*b.x);
 49 end;
 50  
 51 function dis(a,b:point):double;
 52 begin
 53     exit(sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)));
 54 end;
 55  
 56 var
 57     a:array[0..maxn,0..1]of point;
 58     f:array[0..maxn,0..1]of double;
 59     s,t:point;
 60     n:longint;
 61     v:double;
 62  
 63 procedure main;
 64 var
 65     i,j,k,l,r:longint;
 66     up,down:point;
 67 begin
 68     read(n);
 69     for i:=1 to n do
 70         read(a[i,0].x,a[i,0].y,a[i,1].x,a[i,1].y);
 71     read(s.x,s.y,t.x,t.y,v);
 72     if s.x>t.x then swap(s,t);
 73     l:=n;r:=1;
 74     while (a[l,0].x>s.x) or (a[l,0].y>s.y) or (a[l,1].x<s.x) or (a[l,1].y<s.y) do dec(l);
 75     while (a[r,0].x>t.x) or (a[r,0].y>t.y) or (a[r,1].x<t.x) or (a[r,1].y<t.y) do inc(r);
 76     dec(r);
 77     for i:=1 to n-1 do
 78         a[i,0].y:=max(a[i,0].y,a[i+1,0].y);
 79     for i:=1 to n-1 do
 80         a[i,1].y:=min(a[i,1].y,a[i+1,1].y);
 81     for i:=1 to n-1 do a[i,0].x:=a[i,1].x;
 82     dec(l);a[l,0]:=s;a[l,1]:=s;
 83     inc(r);a[r,0]:=t;a[r,1]:=t;
 84     for i:=l+1 to r do
 85         for j:=0 to 1 do
 86             f[i,j]:=inf;
 87     for i:=l to r do
 88         for j:=0 to 1 do
 89             begin
 90                 up:=a[i+1,1];down:=a[i+1,0];
 91                 for k:=i+1 to r do
 92                     begin
 93                         if (down-a[i,j])*(up-a[i,j])<0 then break;
 94                         if ((a[k,1]-a[i,j])*(up-a[i,j])>=0) and ((down-a[i,j])*(a[k,1]-a[i,j])>=0) then
 95                         f[k,1]:=min(f[k,1],f[i,j]+dis(a[i,j],a[k,1])/v);
 96                         if  ((a[k,0]-a[i,j])*(up-a[i,j])>=0) and ((down-a[i,j])*(a[k,0]-a[i,j])>=0) then
 97                         f[k,0]:=min(f[k,0],f[i,j]+dis(a[i,j],a[k,0])/v);
 98                         if (a[k,1]-a[i,j])*(up-a[i,j])>=0 then up:=a[k,1];
 99                         if (down-a[i,j])*(a[k,0]-a[i,j])>=0 then down:=a[k,0];
100                     end;
101             end;
102     writeln(f[r,0]:0:10);
103 end;
104  
105 begin
106     main;
107 end.
View Code
相關文章
相關標籤/搜索