【题目链接】

  1. http://www.lydsy.com/JudgeOnline/problem.php?id=2433

  2. http://221.192.240.123:8586/JudgeOnline/showproblem?problem_id=1668

【题目大意】

  题目已经讲得很清楚了

防剧透

防剧透

防剧透

防剧透

防剧透

防剧透

防剧透

防剧透

防剧透

【解题思路】

  首先可以发现一个性质:路径的转折点只能在矩形的顶点上。这个可以用任意三角形内一点到两顶点的距离<另一点到这两顶点的距离来证明。

  于是这个明显是有阶段性的,也即只能从左到右。于是可以Dp,当然也可以spfa或Dijkstra等等。

  算法关键在于如何求出任意两点间的距离。

  朴素做法要O(n^3),这明显是过不了的。

  我们考虑从每个点开始走,发现每次阻挡视野的都是刚刚走过的矩形的边。于是我们可以维护一个视野,用每个访问过的点更新视野的up or low。

Postscript:记得加上等号……

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cmath>
  4. typedef long long ll;
  5. const int N = 2000 + 9;
  6. struct Point
  7. {
  8. int x,y;
  9. Point(const int _x = 0,const int _y = 0):
  10. x(_x),y(_y){}
  11. }p[N * 4],S,T;
  12. int n,pre[N],start;
  13. double dis[N*4],v;
  14. inline ll sqr(const int x){return 1ll*x*x;}
  15. inline double Dis(const Point x,const Point y)
  16. {return std::sqrt(sqr(y.x-x.x) + sqr(y.y-x.y));}
  17. inline ll cpr(const Point x,const Point y,const Point z)
  18. {
  19. const ll x1 = y.x - x.x, y1 = y.y - x.y;
  20. const ll x2 = z.x - x.x, y2 = z.y - x.y;
  21. return x1*y2 - x2*y1;
  22. }
  23. bool check(const int up,const int low,const Point x,const Point y)
  24. {
  25. if (up && cpr(x,p[up],y) > 0 || low && cpr(x,p[low],y) < 0) return false;
  26. return true;
  27. }
  28. double Dijkstra()
  29. {
  30. static bool ins[N*4];
  31. for (start = 1; start <= n; ++start)
  32. if (p[start].x >= S.x) break;
  33. for (int i = start--; i <= n; ++i) dis[i] = 99999999.0;
  34. dis[start] = 0; p[start] = S; dis[4*N - 1] = 999999999.0; pre[start] = -1;
  35. while (1) {
  36. int k = 4*N - 1;
  37. for (int i = start; i <= n; ++i)
  38. if (!ins[i] && dis[k] > dis[i]) k = i;
  39. if (n == k) return dis[k];
  40. ins[k] = 1;
  41. if (k == 7)
  42. k = 7;
  43. int up = 0,low = 0; double tmp;
  44. for (int i = k + 1; i <= n; ++i) {
  45. if (check(up,low,p[k],p[i]))
  46. if (!ins[i] && dis[i] > (tmp = dis[k] + Dis(p[k],p[i])))
  47. dis[i] = tmp;
  48. if (((i-1)%4+1)&1 && (!up || cpr(p[k],p[up],p[i]) <= 0)) up = i;
  49. else if (!(((i-1)%4+1)&1) && (!low || cpr(p[k],p[low],p[i]) >= 0)) low = i;
  50. if (up && low && cpr(p[k],p[up],p[low]) > 0) break;
  51. }
  52. }
  53. }
  54. int main()
  55. {
  56. #ifndef ONLINE_JUDGE
  57. freopen("2433.in","r",stdin);
  58. freopen("2433.out","w",stdout);
  59. #endif
  60. scanf("%d",&n);
  61. for (int i = 1; i <= n; ++i) {
  62. scanf("%d%d%d%d",&p[i*4-2].x,&p[i*4-2].y,&p[i*4-1].x,&p[i*4-1].y);
  63. p[i*4-3] = Point(p[i*4-2].x,p[i*4-1].y);
  64. p[i*4] = Point(p[i*4-1].x,p[i*4-2].y);
  65. }
  66. scanf("%d%d%d%d",&S.x,&S.y,&T.x,&T.y);
  67. n *= 4;
  68. if (S.x > T.x) std::swap(S,T);
  69. for (; n; --n)
  70. if (p[n].x <= T.x) break;
  71. p[++n] = T;
  72. scanf("%lf",&v);
  73. printf("%.10f\n",Dijkstra()/v);
  74. }

  

[bzoj2433][Noi2011]智能车比赛的更多相关文章

  1. 2433: [Noi2011]智能车比赛 - BZOJ

    Description 新一届智能车大赛在JL大学开始啦!比赛赛道可以看作是由n个矩形区域拼接而成(如下图所示),每个矩形的边都平行于坐标轴,第i个矩形区域的左下角和右上角坐标分别为(xi,1,yi, ...

  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. 【LOJ】#2443. 「NOI2011」智能车比赛

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

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

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

  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. 【NOIP】2013 花匠

    [算法]贪心 [题解] DP可以f[i][0],f[i][1]表示选了i分别满足条件AB的答案,其优化也是利用了下面的性质,不多赘述. 想象数列的波动,最大值一定是取每个波峰和每个波谷,那么只要O(n ...

  2. 【BZOJ】1500: [NOI2005]维修数列

    [算法]splay [题解]数据结构 感谢Occult的模板>_<:HYSBZ 1500 维修数列 #include<cstdio> #include<cctype> ...

  3. Codeforces Round #484 (Div. 2)

    题目链接:http://codeforces.com/contest/982 A. Row time limit per test:1 second memory limit per test:256 ...

  4. bzoj 1927 网络流

    首先我们可以知道这道题中每个点只能经过一次,那么我们引入附加源汇source,sink,那么我们可以将每个点拆成两个点,分别表示对于图中这个节点我们的进和出,那么我们可以连接(source,i,1,0 ...

  5. embed标签 阻止点击事件 让父元素处理点击事件

    由于规定页面显示的PDF文件要有固定大小,使得页面风格统一 最开始发现了CSS样式pointer-events 写出如下代码,在360急速浏览器急速模式中访问可在点击PDF控件时可跳转页面 <a ...

  6. ImportError: libQtTest.so.4: cannot open shared

    错误: import cv2 File , in <module> from .cv2 import * ImportError: libQtTest.so.: cannot open s ...

  7. OpenRCT2

    https://github.com/OpenRCT2/OpenRCT2 https://github.com/LRFLEW/HRM-CCPU https://github.com/LRFLEW/Op ...

  8. linux中没有dos2UNIX或者UNIX2dos命令怎么解决办法

    linux中没有dos2UNIX或者UNIX2dos命令怎么解决办法 http://blog.csdn.net/w616589292/article/details/38274475 dos2unix ...

  9. 动画基础--基于Core Animation(3)

    参考:https://zsisme.gitbooks.io/ios-/content/ 前面的文章动画基础--基于Core Animation(1),动画基础--基于Core Animation(2) ...

  10. 重装系统备份MYSQL数据(整库备份)

    今天要重装Windows 8系统,但是我的Mysql里面数据太多,要备份成sql文件实在太麻烦,于是我听说可以直接拷贝数据文件夹,所以就试了,结果还成果了. 具体如下: 我安装的时候把数据文件夹就放在 ...