JDOJ 1198: VIJOS-P1013 强墙

JDOJ传送门

Description

​ 在一个长宽均为10,入口出口分别为(0,5)、(10,5)的房间里,有几堵墙,每堵墙上有两个缺口,求入口到出口的最短路经。

Input

​ 第一排为n(n< =20),墙的数目。 接下来n排,每排5个实数x,a1,b1,a2,b2。 x表示墙的横坐标(所有墙都是竖直的),a1-b1和a2-b2之间为空缺。 a1、b1、a2、b2保持递增,x1-xn也是递增的。

Output

​ 输出最短距离,保留2位小数。

Sample Input

2 4 2 7 8 9 7 3 4.5 6 7

Sample Output

10.06

Source

VIJOS

最优解声明

题解:

实数域模拟+贪心。

很容易看出来,我们走的最短的距离是按直线走的。如果加了墙的话,就是翻最少的墙使路径接近这个直线即可。

代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
#define min(a,b) a<b?a:b
struct wall
{
double x,z[5];
}w[22];
int n;
double e[101][101];
int judge(int a,int b,int w1,int w2)
{
if (b-a<2) return 1;
double x1=w[a].x,x2=w[b].x,y1=w[a].z[w1],y2=w[b].z[w2];
double k=(y1-y2)/(x1-x2),t=y1-x1*k;
for (int i=a+1;i<b;i++)
{
double y=k*w[i].x+t;
if (y<w[i].z[1]||(y>w[i].z[2]&&y<w[i].z[3])||y>w[i].z[4])
return 0;
}
return 1;
}
void edge(int a,int b,int w1,int w2)
{
if (!judge(a,b,w1,w2))
return;
double x1=w[a].x,x2=w[b].x,y1=w[a].z[w1],y2=w[b].z[w2];
e[a*4+w1][b*4+w2]=e[b*4+w2][a*4+w1]=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
scanf("%d",&n);
memset(e,127,sizeof(e));
for (int i=1;i<=n;i++)
{
scanf("%lf",&w[i].x);
for (int j=1;j<5;j++) scanf("%lf",&w[i].z[j]);
}
w[0].x=0;w[++n].x=10;
for (int i=1;i<5;i++) w[0].z[i]=w[n].z[i]=5;
for (int i=0;i<n;i++) for (int j=i+1;j<=n;j++) for (int k=1;k<5;k++) for (int l=1;l<5;l++) edge(i,j,k,l);
for (int i=0;i<101;i++) e[i][i]=0;
for (int k=1;k<=n*4+4;k++)
for (int i=1;i<=n*4+4;i++)
for (int j=1;j<=n*4+4;j++)
e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
printf("%.2f\n",e[1][n*4+1]);
return 0;
}

VIJOS-P1013 强墙的更多相关文章

  1. C#编写的通过汉字得到拼音和五笔码

    public static class SpellAndWbConfig { #region 变量声明 // XML文件读取实例 /// <summary> /// XML文件读取实例 / ...

  2. .net 生成拼音码与五笔码

    首先加入配置文件: <?xml version="1.0" encoding="utf-8" ?> <CodeConfig> <S ...

  3. 关于C++对汉字拼音的处理(3)

    之所以汉字转拼音的博文能出到3,主要是因为没有很完美的C++的解决方案,但是写到了这里可以有一个小结了. 以前的方法都有这种那种弊端,如果出现了无法识别的汉字(简体的)就无法修改处理了,但是下面的这种 ...

  4. C#中获得汉字的首拼音(加强版)

    /// <summary> /// 汉字拼音首字母列表 /// 包含了20901个汉字,收录的字符的Unicode编码范围为19968至40869 /// </summary> ...

  5. 取汉子拼音首字母的C#方法

    /// <summary> /// 获得一个字符串的汉语拼音码 /// </summary> /// <param name="strText"> ...

  6. 常用汉字大全:汉字读音表GB2312版(共7809个汉字)

    转载请注明来源:https://www.cnblogs.com/hookjc/ 常用汉字:a1:阿啊呵腌吖锕a2:啊呵嗄a3:啊呵a4:啊呵ai1:哀挨埃唉哎捱锿ai2:呆挨癌皑捱ai3:矮哎蔼霭嗳a ...

  7. 【防火墙技术连载11】强叔侃墙 攻击防范篇 流量型攻击之UDP Flood及防御

    http://support.huawei.com/huaweiconnect/enterprise/thread-214141.html

  8. Vijos P1023Victoria的舞会3【贪心+DFS求强联通分量】

    链接:Click Me! P1023Victoria的舞会3 Accepted 标签:Victoria的舞会[显示标签] 描写叙述 Victoria是一位颇有成就的艺术家,他因油画作品<我爱北京 ...

  9. 3D立体显示大屏幕拼接视频墙系统解决方案【转】

    http://shop.souvr.com/thread-123416-1-1.html 随着3D立体视像.全息影像等技术不断取得突破性进展,国内外越来越多的公司投身3D显示领域,产品层出不穷.3D技 ...

随机推荐

  1. Java并发J.U.C学习总结

    转载自http://www.cnblogs.com/chenpi/结合自己理解稍有添加自己的理解 阅读目录 JSR 166及J.U.C Executor框架(线程池. Callable .Future ...

  2. [20191122]oracel SQL parsing function qcplgte.txt

    [20191122]oracel SQL parsing function qcplgte.txt --//昨天看了链接:https://nenadnoveljic.com/blog/memory-l ...

  3. liunxCPU和内存,磁盘等资源

    1.Screen是一款由GNU计划开发的用于命令行终端切换的自由软件.用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换.GNU Screen可以看作是窗口管理器的命令行界面版本. ...

  4. python与数据库交互的模块pymysql

    一.Mysql 1.前提 pip install pymysql import pymysql 2.详情 Connection对象 =====>用于连接数据库 用于建立与数据库的连接 创建对象: ...

  5. 1(1).有监督 VS 无监督

    对比一 : 有标签 vs 无标签 有监督机器学习又被称为“有老师的学习”,所谓的老师就是标签.有监督的过程为先通过已知的训练样本(如已知输入和对应的输出)来训练,从而得到一个最优模型,再将这个模型应用 ...

  6. HTML和css常见问题解答2

    1.将一个块级元素水平和垂直居中有几种方法?分别是什么? 四种方式: (1).要让div等块级元素水平和垂直居中,必需知道该div等块级元素的宽度和高度,然后设置位置为绝对位置,距离页面窗口左边框和上 ...

  7. 【oracle】ORA-00947: 没有足够的值

    insert 时 对应NOT NULL 的列 必须有值

  8. [译]Vulkan教程(32)生成mipmap

    [译]Vulkan教程(32)生成mipmap Generating Mipmaps 生成mipmap Introduction 入门 Our program can now load and ren ...

  9. 磕磕绊绊中,使用Git工具完成代码上传

    1.安装Git工具 1)下载并安装Git工具:Git下载地址 安装完成之后,在桌面空白处点击右键,会出现以下选项: 2.初始化环境 1) 在一文件夹中,点击右键,选择上图中的Git Bash Here ...

  10. 使用pip安装python库的几种方式

    操作系统 : CentOS7.5.1804_x64 Python 版本 : 3.6.8 1.使用pip在线安装 1.1 安装单个package 格式如下: pip install SomePackag ...