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的整数
囧,其实是一道比较简单的dp,一直犯了一个sb错误,没有好好地更新视野,我只用了视野中的点更新视野,操蛋
我们可以从左到右dp,判断是否可以到达,然后更新ans,这个我们只要记录两个点,一个是视野的上界,一个是视野的下界,然后没有视野就break,非常快
const
maxn=;
inf=;
type
point=record
x,y:longint;
end; function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; function min(x,y:double):double;
begin
if x<y then exit(x);
exit(y);
end; function max(x,y:double):double;
begin
if x>y then exit(x);
exit(y);
end; procedure swap(var x,y:point);
var
t:point;
begin
t:=x;x:=y;y:=t;
end; operator -(a,b:point)c:point;
begin
c.x:=a.x-b.x;
c.y:=a.y-b.y;
end; operator *(a,b:point)c:longint;
begin
exit(a.x*b.y-a.y*b.x);
end; function dis(a,b:point):double;
begin
exit(sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)));
end; var
a:array[..maxn,..]of point;
f:array[..maxn,..]of double;
s,t:point;
n:longint;
v:double; procedure main;
var
i,j,k,l,r:longint;
up,down:point;
begin
read(n);
for i:= to n do
read(a[i,].x,a[i,].y,a[i,].x,a[i,].y);
read(s.x,s.y,t.x,t.y,v);
if s.x>t.x then swap(s,t);
l:=n;r:=;
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);
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);
dec(r);
for i:= to n- do
a[i,].y:=max(a[i,].y,a[i+,].y);
for i:= to n- do
a[i,].y:=min(a[i,].y,a[i+,].y);
for i:= to n- do a[i,].x:=a[i,].x;
dec(l);a[l,]:=s;a[l,]:=s;
inc(r);a[r,]:=t;a[r,]:=t;
for i:=l+ to r do
for j:= to do
f[i,j]:=inf;
for i:=l to r do
for j:= to do
begin
up:=a[i+,];down:=a[i+,];
for k:=i+ to r do
begin
if (down-a[i,j])*(up-a[i,j])< then break;
if ((a[k,]-a[i,j])*(up-a[i,j])>=) and ((down-a[i,j])*(a[k,]-a[i,j])>=) then
f[k,]:=min(f[k,],f[i,j]+dis(a[i,j],a[k,])/v);
if ((a[k,]-a[i,j])*(up-a[i,j])>=) and ((down-a[i,j])*(a[k,]-a[i,j])>=) then
f[k,]:=min(f[k,],f[i,j]+dis(a[i,j],a[k,])/v);
if (a[k,]-a[i,j])*(up-a[i,j])>= then up:=a[k,];
if (down-a[i,j])*(a[k,]-a[i,j])>= then down:=a[k,];
end;
end;
writeln(f[r,]::);
end; begin
main;
end.
2433: [Noi2011]智能车比赛 - BZOJ的更多相关文章
- [bzoj2433][Noi2011]智能车比赛
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2433 http://221.192.240.123:8586/JudgeOnline/ ...
- Noi2011 : 智能车比赛
假设S在T左边,那么只能往右或者上下走 f[i]表示S到i点的最短路 f[i]=min(f[j]+dis(i,j)(i能看到j)) 判断i能看到j就维护一个上凸壳和一个下凸壳 时间复杂度$O(n^2) ...
- [NOI2011]智能车比赛 (计算几何 DAG)
/* 可以发现, 最优路径上的所有拐点, 基本上都满足一定的性质, 也就是说是在矩形上的拐角处 所以我们可以把他们提出来, 单独判断即可 由于我们提出来的不超过2n + 2个点, 我们将其按照x坐标排 ...
- 【[NOI2011]智能车比赛】(建图+spfa+坑爹精度)
过了这题我就想说一声艹,跟这个题死磕了将近6个小时,终于是把这个题死磕出来了.首先看到这个题的第一反应,和当初做过的一个房间最短路比较相似,然后考虑像那个题那样建边,然后跑最短路.(具体建边方法请参考 ...
- BZOJ 2433 智能车比赛(计算几何+最短路)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2433 题意:若干个矩形排成一排(同一个x之上最多有一个矩形),矩形i和i+1相邻.给定两 ...
- 【LOJ】#2443. 「NOI2011」智能车比赛
题解 显然是个\(n^2\)的dp 我们要找每个点不穿过非赛道区域能到达哪些区域的交点 可以通过控制两条向量负责最靠下的上边界,和最靠上的下边界,检查当前点在不在这两条向量之间即可,对于每个点可以\( ...
- 智能车学习(十五)——K60野火2013版例程
一.中断函数注册方法: 1.格式: 配置某个功能的中断 注册中断函数 开启中断 2.一个例子 pit_init_ms(PIT0,);//定时中断初始化 set_vector_handler(PIT0_ ...
- K60平台智能车开发工作随手记
(图片仅为示例,并不一定固定为这种造型) 第十二届全国大学生智能汽车竞赛有一个分项是光电四轮车的竞速(任务A),Seven她们组采购到的配件使用了freescale Crotex-M4内核的CPU,T ...
- 【sky第二期--PID算法】--【智能车论坛】
[sky第二期--PID算法] 想学PID的可以来[智能车论坛]这里有我发布的资料http://bbs.tekbots.eefocus.com/forum.php?mod=viewthread& ...
随机推荐
- JavaScript之返回顶部
为了弄这个Hexo,今天又是坐在电脑面前待了一天( ⊙ o ⊙ ),老是出问题,在百度上也试验了很多方法,还是没弄好,诶...身心疲惫甚是乏累啊~~~ 算了,这个Hexo先不弄,还是安分点吧,在Hex ...
- ubuntu安装python3
系统本身就已经安装了python2.7 和python3.4 现在需要做的就是将默认的版本更换一下下就可以了. 检查python的版本 python -V 老的版本没必要去产出了,因为会有一些程序依赖 ...
- 苹果系统开发中的混合编程(2):Swift和C的相互调用
在进行Swift和C之间的相互调用时,有必要先了解一下两种语言之间的类型转换关系: C 类型 Swift 类型 bool CBool char, signed char CChar unsig ...
- [Android开发系列]IT博客应用
1.关于坑 好吧,在此之前先来说一下,之前开的坑,恩,确实是坑,前面开的两个android开发教程的坑,对不起,实在是没什么动力了,不过源码都有的,大家可以参照github这个应用 https://g ...
- Cocos2d-x 3.x的Windows Phone 8工程
Cocos2d-x 3.x中我们使用的Cocos2d-x 3.2,它提供了Windows Phone 8平台的支持.下面我们介绍一下在Cocos2d-x 3.2中如何生成Cocos2d-x的Windo ...
- 转载:python文件打开方式详解——a、a+、r+、w+区别
第一步 排除文件打开方式错误: r只读,r+读写,不创建 ###f.readline()是读取第一行,f.readlines()是读取全部并返回一个列表 w新建只写,w+新建读写,会将文件内 ...
- 9 款赏心悦目的 HTML5/CSS3 特效
1.HTML5 WebGL实验,超酷的HTML5 Canvas波浪墙 这是一款HTML5 Canvas实验项目,也是波浪特效,只是这不是真正的水波,而是利用柱体高度的变化实现的波浪墙效果. 在线演示 ...
- android 数据库_sql语句总结
表的创建db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20)") ...
- Codevs
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 给出n和n个整数,希望你从小到大给他们排序 输入描述 I ...
- 获取iOS设备信息的编程接口
参考资料: [1] 博客园,iOS屏幕尺寸和分辨率了解 [2] 张兴业,获取手机信息(UIDevice.NSBundle.NSLocale), CSDN