New Game!

描述

题目描述:

Eagle Jump公司正在开发一款新的游戏。泷本一二三作为其员工,获得了提前试玩的机会。现在她正在试图通过一个迷宫。

这个迷宫有一些特点。为了方便描述,我们对这个迷宫建立平面直角坐标系。迷宫中有两条平行直线 L1​:Ax+By+C1​=0, L2​:Ax+By+C2​=0,

还有 n个圆 Ci​:(x−xi​)^2+(y−yi​)^2=ri^​2。角色在直线上、圆上、圆内行走不消耗体力。在其他位置上由S点走到T点消耗的体力为S和T的欧几里得距离。

泷本一二三想从 L1​ 出发,走到L2​ 。请计算最少需要多少体力。

输入:

第一行五个正整数 n,A,B,C1​,C2​ (1≤n≤1000,−10000≤A,B,C1​,C2​≤10000),其中 A,B不同时为 0。

接下来 n 行每行三个整数 x,y,r(−10000≤x,y≤10000,1≤r≤10000) 表示一个圆心为 (x,y),半径为 r 的圆。

输出:

仅一行一个实数表示答案。与标准答案的绝对误差或者相对误差不超过10^−4 即算正确。

样例输入
2 0 1 0 -4
0 1 1
1 3 1
样例输出
0.236068

由于圆是没有消耗的,所以可以将每个圆都坍缩成点,然后求L1到L2的最短路即可。
 #include<math.h>
#include<stdio.h>
#define MAXN 1000
struct point
{
double x,y;
};
struct line
{
point a,b;
}; double distance(point p1,point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double disptoline(point p1,double a,double b,double c)
{
double x=sqrt(a*a+b*b);
return fabs((a*p1.x+b*p1.y+c)/x);
} point pp[];
double r[];
double e[][],d[];
int used[];
double inf=1e9;
void dij(int s,int n)
{ int v,u,max=; for(u=;u<=n;u++)
d[u]=inf,used[u]=; d[s]=; while()
{ v=-;
for(u=;u<=n;u++)
{ if(!used[u]&&(v==-||d[u]<d[v]))
v=u; }
if(v==-) break;
used[v]=; for(u=;u<=n;u++)
if(d[u]>d[v]+e[v][u])
d[u]=d[v]+e[v][u];
}
} int main()
{
int n;
double a,b,c1,c2;
scanf("%d",&n);
scanf("%lf%lf%lf%lf",&a,&b,&c1,&c2);
for(int i=;i<=n+;i++)
{
for(int j=;j<=n+;j++)
e[i][j]=inf;
}
for(int i=;i<=n;i++)
{
scanf("%lf%lf%lf",&pp[i].x,&pp[i].y,&r[i]);
} for(int i=;i<=n;i++)
{
double lt=disptoline(pp[i],a,b,c1); if(lt<r[i]) e[][i]=;
else e[][i]=lt-r[i];
}
for(int i=;i<=n;i++)
{
double lt=disptoline(pp[i],a,b,c2);
if(lt<r[i]) e[i][n+]=;
else e[i][n+]=lt-r[i];
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{ if(i==j) continue;
double lt=distance(pp[i],pp[j]);
if(lt>r[i]+r[j]) e[i][j]=lt-r[i]-r[j];
else e[i][j]=;
}
point t;
t.y=1.0,t.x=-(b*1.0+c1)/a;
e[][n+]=disptoline(t,a,b,c2);
dij(,n+); printf("%.10f\n",d[n+]);
return ;
}
 
 

2018 Wannafly summer camp Day2--New Game!的更多相关文章

  1. 2018 Wannafly summer camp Day8--连通块计数

    连通块计数 描述 题目描述: 小 A 有一棵长的很奇怪的树,他由 n 条链和 1 个点作为根构成,第 i条链有 ai​ 个点,每一条链的一端都与根结点相连. 现在小 A 想知道,这棵长得奇怪的树有多少 ...

  2. 2018 Wannafly summer camp Day2--Utawarerumono

    Utawarerumono 描述 题目描述: 算术是为数不多的会让久远感到棘手的事情.通常她会找哈克帮忙,但是哈克已经被她派去买东西了.于是她向你寻求帮助. 给出一个关于变量x,y的不定方程ax+by ...

  3. 2018 Wannafly summer camp Day8--区间权值

    区间权值 小Bo有\(n\)个正整数\(a_1\)--\(a_n\),以及一个权值序列\(w_1\)--\(w_n\),现在她定义\(f(l,r)=(\sum_{i=l}^r a_i^2) *w_{r ...

  4. 2018 Wannafly summer camp Day3--Shopping

    Shopping 描述 题目描述: 你要买n件物品,其中有一些是凳子. 商场正在举行促销活动,如果购物车中有至少一个凳子,那么你可以半价购买这个购物车中最贵的一个物品. 你有m辆购物车,请最小化你的花 ...

  5. 2018 Wannafly summer camp Day3--Travel

    Travel 描述 题目描述: 魔方国有n座城市,编号为1~n.城市之间通过n-1条无向道路连接,形成一个树形结构. 澜澜打算在魔方国进行mm次旅游,每次游览至少一座城市.为了方便,每次旅游游览的城市 ...

  6. 2018 Wannafly summer camp Day3--Knight

    Knight 题目描述: 有一张无限大的棋盘,你要将马从\((0,0)\)移到\((n,m)\). 每一步中,如果马在\((x,y)(x,y)\),你可以将它移动到 \((x+1,y+2)(x+1,y ...

  7. 牛客网补题 New Game!(原Wannafly summer camp day2原题)

    思路:这个题在秦皇岛的时候好像没有写出来,反正我是没有写出来,题解是听懂了:把直线和圆都看做一个结点,圆和直线用点到直线的距离与半径差求出来,圆和圆之间用点和点之间的距离和半径差表示,最后最短路跑一遍 ...

  8. 2019 wannafly winter camp

    2019 wannafly winter camp Name Rank Solved A B C D E F G H I J K day1 9 5/11 O O O O O day2 5 3/11 O ...

  9. 2019 wannafly winter camp day 3

    2019 wannafly winter camp day 3 J 操作S等价于将S串取反,然后依次遍历取反后的串,每次加入新字符a,当前的串是T,那么这次操作之后的串就是TaT.这是第一次转化. 涉 ...

随机推荐

  1. CSS中关于linebox的baseline位置移动的理解

    前言 最近看到一篇文章,弗里得木的翻译笔记,里面有个问题没有解决,就是linebox的baseline为什么会移动呢? 在讨论这个问题之前读者需要对 默认值baseline 以及 其他属性值(天镶的博 ...

  2. JS图片赖加载例子

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 用JQ帮你实现动画导航 手风琴是导航与下拉导航

    1.手风琴式导航,既可以适用于移动端也可使用与PC端 <!DOCTYPE html> <html> <head> <meta charset="UT ...

  4. ${pageContext.request.contextPath}是JSP取得绝对路径(转载)

    ${pageContext.request.contextPath}是JSP取得绝对路径的方法,等价于<%=request.getContextPath()%> . 也就是取出部署的应用程 ...

  5. mfc自动创建按钮消息处理并清除

        以前参加一次面试有这道题,当时没有网络没有做出来,今天在网上整理了一下,实现如下. .h中增加下面代码     //生成的消息映射函数     virtual BOOL OnInitDialo ...

  6. .NET开源工作流RoadFlow-表单设计-文本域

    点击工具栏上的 文本域 按钮可弹出文本域属性设置: 绑定字段:与数据表的某个字段绑定. 默认值:文本域初始值. 最大字符数:文本域可输入的最大字符数. 宽度:文本域的宽度,如:200px,80%. 高 ...

  7. cocos2d-x 学习笔记之 CCMenuItemToggle用法

    想做用cocos2d-x做一个登陆界面,界面有有个记住账号的功能,但是该引擎我没有找到类似checkbox的类,考虑到Toggle也是开关即0和1,故考虑用这个类来实现. CCMenuItemImag ...

  8. linux 安装和卸载软件

    安装: apt-get install cups-pdf 卸载:apt -get remove cups

  9. 汽车后市场SWOT分析

    客户接待系统SWOT分析 版本  V0.1 所有人: 王超 S  客户接待系统符合市场的目前阶段需求.填补了市场的空白部分. W 市场推广的力度差异,市场由蓝海编成红海,多种厂商参与,创业团队不断进入 ...

  10. mongodb 3.4 学习 (三)复制集

    复制集(replica set) 复制集是一组mongodb的进程维护同样的数据集,提供冗余与高可用性.最小的复制集由3台服务器(或者3个实例)组成,最多1个primary和2个secondary实例 ...