牛客国庆集训派对Day1 L-New Game!(最短路)
链接:https://www.nowcoder.com/acm/contest/201/L
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 1048576K,其他语言2097152K
Special Judge, 64bit IO Format: %lld
题目描述
Eagle Jump公司正在开发一款新的游戏。Hifumi Takimoto作为其中的员工,获得了提前试玩的机会。现在她正在试图通过一个迷宫。
这个迷宫有一些特点。为了方便描述,我们对这个迷宫建立平面直角坐标系。迷宫中有两条平行直线 L1:Ax+By+C1=0, L2:Ax+By+C2=0,还有 n 个圆 。角色在直线上、圆上、园内行走不消耗体力。在其他位置上由S点走到T点消耗的体力为S和T的欧几里得距离。
Hifumi Takimoto想从 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 即算正确。
示例1
输入
2 0 1 0 -4
0 1 1
1 3 1
输出
0.236068
思路
将第一条线作为起点(第0个点),第二条线作为终点(第n+1个点),第i个圆作为第i个点,这些线与线,线与圆的最短距离作为两点间的权值进行建图,然后求最短路就可以了
AC代码
//数据好水,这个代码有好多样例都过不去,但是竟然AC了,我以前用的迪杰斯特拉模板不知道为什么会WA,换成百度找的AC代码里的模板过了。。。好多bug,懒得改了,思路大致就是这样
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#define ll long long
#define ull unsigned long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)
#define INF 0x7f7f7f7f
#define lson o<<1
#define rson o<<1|1
const double E=exp(1);
const int maxn=1e3+10;
const int mod=1e9+7;
using namespace std;
struct wzy
{
int x,y,r;
}p[maxn];
inline double juli(int a,int b,int c,int x,int y)
{
double _=sqrt(a*1.0*a*1.0+b*1.0*b*1.0);
double __=a*1.0*x+b*1.0*y+c*1.0;
return fabs(__/_);
}
inline double juli1(int x,int y,int x1,int y1)
{
double _=sqrt(fabs(x*1.0-x1*1.0)*fabs(x*1.0-x1*1.0)+fabs(y*1.0-y1*1.0)*fabs(y*1.0-y1*1.0));
return _;
}
double edge[maxn][maxn];
int flag[maxn]; //flag[i]标记节点i是否被查询
double dis[maxn]; //dis[i]表示节点i距离起始节点的最短距离
int n,m,a,b,c1,c2; //n个点,m条边
inline void Dijkstra()
{
memset(flag,0,sizeof(flag));
for(int i=0;i<=n+1;i++)
dis[i]=INF;
dis[0]=0;
while(1)
{
int v=-1;
for(int i=0;i<=n+1;i++)
{
if(!flag[i] && (v==-1 || dis[i]<dis[v]))
v=i;
}
if(v==-1)break;
flag[v]=1;
for(int i=0;i<=n+1;i++)
dis[i]=min(dis[i],dis[v]+edge[v][i]);
}
}
int main(int argc, char const *argv[])
{
scanf("%d%d%d%d%d",&n,&a,&b,&c1,&c2);
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++)
edge[i][j]=edge[j][i]=INF;
for(int i=1;i<=n;i++)
scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].r);
// 求第一个直线
for(int i=1;i<=n;i++)
{
double res=juli(a,b,c1,p[i].x,p[i].y)-p[i].r*1.0;
if(res<0)
edge[0][i]=edge[i][0]=0.0;
else
edge[0][i]=edge[i][0]=res;
}
// 求第二个直线
for(int i=1;i<=n;i++)
{
double res=juli(a,b,c2,p[i].x,p[i].y)-p[i].r*1.0;
if(res<0)
edge[n+1][i]=edge[i][n+1]=0.0;
else
edge[n+1][i]=edge[i][n+1]=res;
}
// 两圆距离
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
double res=juli1(p[i].x,p[i].y,p[j].x,p[j].y)-p[i].r*1.0-p[j].r*1.0;
if(res<0)
edge[j][i]=edge[i][j]=0.0;
else
edge[j][i]=edge[i][j]=res;
}
}
Dijkstra();
printf("%.6lf\n",dis[n+1]);
return 0;
}
牛客国庆集训派对Day1 L-New Game!(最短路)的更多相关文章
- 牛客国庆集训派对Day1 L New Game!(堆优化dijkstra+建图)
链接:https://ac.nowcoder.com/acm/contest/201/L来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097 ...
- 2019牛客国庆集训派对day1(A, B E F K)
链接:https://ac.nowcoder.com/acm/contest/1099#question A:可知符合条件的图中间肯定存在一个由1构成的矩形,找到由1构成矩形的边界,判断出现的1的数量 ...
- 牛客国庆集训派对Day1 Solution
A Tobaku Mokushiroku Kaiji 水. #include <bits/stdc++.h> using namespace std; ], b[]; void Ru ...
- 牛客国庆集训派对Day1:J:Princess Principal(栈模拟求括号匹配)
题目描述 阿尔比恩王国(the Albion Kingdom)潜伏着一群代号“白鸽队(Team White Pigeon)”的间谍.在没有任务的时候,她们会进行各种各样的训练,比如快速判断一个文档有没 ...
- 2019牛客国庆集训派对day1 K题 双向链表练习题 splay区间翻转
题目链接: 解法: 先建n颗平衡树,合并的时候将a中最右的结点翻转到根节点,b中最左的结点翻转到根节点,对合并后的根节点进行标记. #include <bits/stdc++.h> usi ...
- 牛客国庆集训派对Day1.B.Attack on Titan(思路 最短路Dijkstra)
题目链接 \(Description\) 给定\(n,m,C\)及大小为\((n+1)(m+1)\)的矩阵\(c[i][j]\).平面上有\((n+1)(m+1)\)个点,从\((0,0)\)编号到\ ...
- 牛客国庆集训派对Day1 B. Attack on Titan
B. Attack on Titan 链接 #include<cstdio> #include<algorithm> #include<cstring> #incl ...
- 2019牛客国庆集训派对day1
C 存每个值存在的位置,枚举末尾的值,再枚举前面的值,哈希二分出最长相同的,即剩下的为不同的 D \(f_{i,j,k}\)为前i位,最后一个3因子在j,次因子在k G bitset处理有多少位置符合 ...
- 牛客国庆集训派对Day6 A Birthday 费用流
牛客国庆集训派对Day6 A Birthday:https://www.nowcoder.com/acm/contest/206/A 题意: 恬恬的生日临近了.宇扬给她准备了一个蛋糕. 正如往常一样, ...
随机推荐
- 一篇文章有若干行,以空行作为输入结束的条件。统计一篇文章中单词the(不管大小写,单词the是由空格隔开的)的个数。
#include <iostream>using namespace std; int k = 0;int n = 0;int main() { char c; char a[1000]; ...
- Java线程池理解及用法
前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory ...
- maven多模块项目找不到Class错误
接手了一个maven管理的多模块项目,又是javaconfig,又是spring data jpa,还算是比较新比较正规的模块化结构吧..然后我往其中的一个模块中新添加了一个jpa的entity,然后 ...
- Could not load driverClass ${driverClassName} 的解决方案
对项目进行ssm整合的过程中,发现报这个错误:Could not load driverClass ${driverClassName} 不明所以,在网上找了半天,各种答案都有,最后终于找 ...
- 自动化创建tornado项目
tornado目录结构: index.py 入口文件 app app目录 |___ __init__.py 初始化脚本 |___ templates 模板目录 | |___ index ...
- DevExpress v18.1新版亮点——Reporting篇(二)
用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress Reporting v18.1 的新功能,快来下载试用新版本 ...
- 在linux执行kettle
1.下载 最新版下载 7.1 https://community.hitachivantara.com/docs/DOC-1009855 2.准备 3.上传任务文件 .kjb,.ktr 4.上传mys ...
- powerdesigner导出sql时报错 Generation aborted due to errors detected during the verification of the model.
powerdesigner导出sql时报错 Generation aborted due to errors detected during the verification of the model ...
- mvc4使用KindEditor文本编辑器
最近做项目要用文本编辑器,编辑器好多种,这里介绍KindEditor在asp.net mvc4中的使用方法. 一.准备工作: 1.下载KindEditor.去官网:http://www.kindsof ...
- leetcode55:跳跃游戏
解题思路1: 从头往后找每一个为0的元素,判断这个0能够跳过,所有的0都能跳过,则返回True,否则返回False 解题思路2: 从前往后遍历数组,设置一个访问到当前位置i时最远可调到的距离maxle ...