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的整数

囧,其实是一道比较简单的dp,一直犯了一个sb错误,没有好好地更新视野,我只用了视野中的点更新视野,操蛋

我们可以从左到右dp,判断是否可以到达,然后更新ans,这个我们只要记录两个点,一个是视野的上界,一个是视野的下界,然后没有视野就break,非常快

  1. const
  2. maxn=;
  3. inf=;
  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[..maxn,..]of point;
  58. f:array[..maxn,..]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:= to n do
  70. read(a[i,].x,a[i,].y,a[i,].x,a[i,].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:=;
  74. while (a[l,].x>s.x) or (a[l,].y>s.y) or (a[l,].x<s.x) or (a[l,].y<s.y) do dec(l);
  75. while (a[r,].x>t.x) or (a[r,].y>t.y) or (a[r,].x<t.x) or (a[r,].y<t.y) do inc(r);
  76. dec(r);
  77. for i:= to n- do
  78. a[i,].y:=max(a[i,].y,a[i+,].y);
  79. for i:= to n- do
  80. a[i,].y:=min(a[i,].y,a[i+,].y);
  81. for i:= to n- do a[i,].x:=a[i,].x;
  82. dec(l);a[l,]:=s;a[l,]:=s;
  83. inc(r);a[r,]:=t;a[r,]:=t;
  84. for i:=l+ to r do
  85. for j:= to do
  86. f[i,j]:=inf;
  87. for i:=l to r do
  88. for j:= to do
  89. begin
  90. up:=a[i+,];down:=a[i+,];
  91. for k:=i+ to r do
  92. begin
  93. if (down-a[i,j])*(up-a[i,j])< then break;
  94. if ((a[k,]-a[i,j])*(up-a[i,j])>=) and ((down-a[i,j])*(a[k,]-a[i,j])>=) then
  95. f[k,]:=min(f[k,],f[i,j]+dis(a[i,j],a[k,])/v);
  96. if ((a[k,]-a[i,j])*(up-a[i,j])>=) and ((down-a[i,j])*(a[k,]-a[i,j])>=) then
  97. f[k,]:=min(f[k,],f[i,j]+dis(a[i,j],a[k,])/v);
  98. if (a[k,]-a[i,j])*(up-a[i,j])>= then up:=a[k,];
  99. if (down-a[i,j])*(a[k,]-a[i,j])>= then down:=a[k,];
  100. end;
  101. end;
  102. writeln(f[r,]::);
  103. end;
  104.  
  105. begin
  106. main;
  107. end.

2433: [Noi2011]智能车比赛 - BZOJ的更多相关文章

  1. [bzoj2433][Noi2011]智能车比赛

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2433 http://221.192.240.123:8586/JudgeOnline/ ...

  2. Noi2011 : 智能车比赛

    假设S在T左边,那么只能往右或者上下走 f[i]表示S到i点的最短路 f[i]=min(f[j]+dis(i,j)(i能看到j)) 判断i能看到j就维护一个上凸壳和一个下凸壳 时间复杂度$O(n^2) ...

  3. [NOI2011]智能车比赛 (计算几何 DAG)

    /* 可以发现, 最优路径上的所有拐点, 基本上都满足一定的性质, 也就是说是在矩形上的拐角处 所以我们可以把他们提出来, 单独判断即可 由于我们提出来的不超过2n + 2个点, 我们将其按照x坐标排 ...

  4. 【[NOI2011]智能车比赛】(建图+spfa+坑爹精度)

    过了这题我就想说一声艹,跟这个题死磕了将近6个小时,终于是把这个题死磕出来了.首先看到这个题的第一反应,和当初做过的一个房间最短路比较相似,然后考虑像那个题那样建边,然后跑最短路.(具体建边方法请参考 ...

  5. BZOJ 2433 智能车比赛(计算几何+最短路)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2433 题意:若干个矩形排成一排(同一个x之上最多有一个矩形),矩形i和i+1相邻.给定两 ...

  6. 【LOJ】#2443. 「NOI2011」智能车比赛

    题解 显然是个\(n^2\)的dp 我们要找每个点不穿过非赛道区域能到达哪些区域的交点 可以通过控制两条向量负责最靠下的上边界,和最靠上的下边界,检查当前点在不在这两条向量之间即可,对于每个点可以\( ...

  7. 智能车学习(十五)——K60野火2013版例程

    一.中断函数注册方法: 1.格式: 配置某个功能的中断 注册中断函数 开启中断 2.一个例子 pit_init_ms(PIT0,);//定时中断初始化 set_vector_handler(PIT0_ ...

  8. K60平台智能车开发工作随手记

    (图片仅为示例,并不一定固定为这种造型) 第十二届全国大学生智能汽车竞赛有一个分项是光电四轮车的竞速(任务A),Seven她们组采购到的配件使用了freescale Crotex-M4内核的CPU,T ...

  9. 【sky第二期--PID算法】--【智能车论坛】

    [sky第二期--PID算法] 想学PID的可以来[智能车论坛]这里有我发布的资料http://bbs.tekbots.eefocus.com/forum.php?mod=viewthread& ...

随机推荐

  1. 二维码扫描 zxing源码分析(三)result、history部分

    前两个部分的地址是:ZXING源码分析(一)CAMERA部分  . zxing源码分析(二)decode部分 下面我们来看第三部分 result包下面有很多的类,其中的核心类是 com.google. ...

  2. Part 7 Joins in sql server

    Joins in sql server Advanced or intelligent joins in sql server Self join in sql server Different wa ...

  3. MFC中改变控件的大小和位置

    用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置. void MoveWindow(int x,int y,int nWidth,int nHeight ...

  4. 苹果系统开发中的混合编程(1):Objective-C和C++的相互调用

    首先是OC调用C++的代码.   创建一个Objective-C的项目,并创建c++文件MyCppFile.hpp和MyCppFile.cpp.   把要调用Cpp代码的文件名改成mm后缀名,项目代码 ...

  5. ThinkPHP中的模型二

    ThinkPHP中的模型 1.为什么要创建数据对象 案例:使用ThinkPHP完成部门管理 ① 设计数据库 ② 创建Dept控制器 路径:./Application/Admin/Controller创 ...

  6. HDU1022 Train Problem I 栈的模拟

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 栈的模拟,题目大意是已知元素次序, 判断出栈次序是否合理. 需要考虑到各种情况, 分类处理. 常 ...

  7. 济南学习 Day 1 T2 am

    死亡[问题描述]现在有M个位置可以打 sif,有N +1个人在排队等着打 sif.现在告诉你 个人每个人需要多长的时间打 sif,问你第N +1个人什么时候才能打 sif. (前N个人必须按照顺序来) ...

  8. Rhythmbox中文乱码解决办法

    今天在网络上找到了一个比较好的解决Rhythmbox中文乱码的问题的方法 进入你的音乐文件夹执行如下代码: mid3iconv -e GBK *.mp3 如果没有提示多试几次,有可能系统会提示: py ...

  9. [Jsp]防止页面表单重复提交的解决方法

    个人学习笔记,写下方便以后复用. 当我们写了个注册页面时候,用户完成注册并提交,用户注册的资料并录入数据库保存,最不希望出现的是在一个会话中出现多次提交的结果,我们可以通过为请求设置标记来避免此类事件 ...

  10. 《linux文件权限管理大总结》RHEL6

    在linux系统下文件的权限通常会以下面的格式显示出来: Chmod文件权限: 权限的管理chmod -a  所有的权限 -u 文件所有者的权限 -g 组权限 -o 其他用户的权限 可以使用运算符来设 ...