CCPC-Wannafly Camp #2 (部分题解)
L: New Game!
题目描述:
Eagle Jump公司正在开发一款新的游戏。泷本一二三作为其员工,获得了提前试玩的机会。现在她正在试图通过一个迷宫。
这个迷宫有一些特点。为了方便描述,我们对这个迷宫建立平面直角坐标系。迷宫中有两条平行直线 L\_1:Ax+By+C\_1=0L1:Ax+By+C1=0, L\_2:Ax+By+C\_2=0L2:Ax+By+C2=0,还有 nn 个圆 C\_i:(x-x\_i)^2+(y-y\_i)^2={r\_i}^2Ci:(x−xi)2+(y−yi)2=ri2。角色在直线上、圆上、圆内行走不消耗体力。在其他位置上由SS点走到TT点消耗的体力为SS和TT的欧几里得距离。
泷本一二三想从 L\_1L1 出发,走到 L\_2L2 。请计算最少需要多少体力。
输入:
第一行五个正整数 n,A,B,C\_1,C\_2n,A,B,C1,C2 (1\le n \le 1000, -10000 \le A,B,C\_1,C\_2 \le 10000)(1≤n≤1000,−10000≤A,B,C1,C2≤10000),其中 A,BA,B 不同时为 0。
接下来 nn 行每行三个整数 x,y,r(-10000 \le x,y \le 10000, 1\le r \le 10000)x,y,r(−10000≤x,y≤10000,1≤r≤10000) 表示一个圆心为 (x,y)(x,y),半径为 rr 的圆。
输出:
仅一行一个实数表示答案。与标准答案的绝对误差或者相对误差不超过 10^{-4}10−4 即算正确。
样例输入
2 0 1 0 -4
0 1 1
1 3 1
样例输出
0.236068
L1 到 L2 之间连边权值 |C1−C2| / √ A2+B2
线 L 与圆 i 之间连边权值 max(0, d(Oi , L1) − ri)
圆 i 与圆 j 之间连边权值 max(0, d(Oi , Oj ) − ri − rj )
求 L1 到 L2 的最短路即可。
#include<bits/stdc++.h>
#define ios1 ios::sync_with_stdio(0)
#define ios2 cin.tie(0)
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 5000;
int n, A, B, C1, C2;
double Map[maxn][maxn];
struct node{
double x, y, r;
}circle[maxn];
void init() {
for(int i = 0 ; i <= n + 1; i++){
for(int j = 0; j <= n + 1; j++) {
if(i == j)Map[i][j] = 0;
else Map[i][j] = inf;
}
}
}
bool cmp (node p, node q) {
if(p.x == q.x)return p.y < p.y;
return p.x < p.y;
}
double dis[maxn];
bool vis[maxn];
void Dijkstra() {
for (int i = 0; i <= n+1; i++) {
dis[i] = Map[0][i];
}
vis[0] = 1;
for (int i = 0; i < n+1; i++) {
double MIN = inf;
int x = -1;
for (int j = 0; j <= n+1; j++) {
if (!vis[j] && dis[j]<MIN) {
MIN = dis[j];
x = j;
}
}
vis[x] = 1;
for (int j = 0; j <= n+1; j++) {
if (!vis[j] && MIN + Map[x][j]<dis[j]) {
dis[j] = Map[x][j] + MIN;
}
}
}
}
int main() {
ios1; ios2;
while(cin >> n >> A >> B >> C1 >> C2) {
for(int i = 1; i <= n; i++) {
cin >> circle[i].x >> circle[i].y >> circle[i].r;
}
init();
Map[0][n+1] = Map[n+1][0] = abs(C1-C2)/sqrt(A*A+B*B);
for(int i = 1; i <= n; i++) {
double k = abs(A*circle[i].x + B*circle[i].y + C1)/sqrt(A*A+B*B) - circle[i].r;
if(k < 0)k = 0;
Map[0][i] = Map[i][0] = k;
}
for(int i = 1; i <= n; i++) {
double k = abs(A*circle[i].x + B*circle[i].y + C2)/sqrt(A*A+B*B) - circle[i].r;
if(k < 0)k = 0;
Map[i][n+1] = Map[n+1][i] = k;
}
for(int i = 1 ; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(i != j){
double k = sqrt(abs(circle[i].x - circle[j].x) * abs(circle[i].x - circle[j].x) + abs(circle[i].y - circle[j].y) * abs(circle[i].y - circle[j].y)) - circle[i].r - circle[j].r;
if(k < 0)k = 0;
Map[i][j] = k;
}
}
}
memset(vis, 0, sizeof(vis));
Dijkstra();
printf("%lf\n", dis[n+1]);
}
return 0;
}
CCPC-Wannafly Camp #2 (部分题解)的更多相关文章
- Codeforces 1167c(ccpc wannafly camp day1) News Distribution 并查集模板
题目: In some social network, there are nn users communicating with each other in mm groups of friends ...
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
- Wannafly 挑战赛 19 参考题解
这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...
- 2021 CCPC 威海站 VP记录(题解)
2021 CCPC 威海站 VP记录(题解) 题目顺序为vp时开题顺序: A - Goodbye, Ziyin! 签到,连边数小于等于2的可以作为二叉树根,若有大于4的直接输出0. code: voi ...
- CCPC Wannafly Winter Camp Div2 部分题解
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
- CCPC、Petrozavodsk Camp、OpenCup 题解汇总
省赛 \([\text{2021.11.30}]\) 2021 Jilin Collegiate Programming Contest 全部完成. \([\text{2021.12.25}]\) 2 ...
- 2020 CCPC Wannafly Winter Camp Day1-F-乘法
题目传送门 sol:二分答案$K$,算大于$K$的乘积有多少个.关键在于怎么算这个个数,官方题解上给出的复杂度是$O(nlogn)$,那么计算个数的复杂度是$O(n)$的.感觉写着有点困难,自己写了一 ...
- 2020 CCPC Wannafly Winter Camp Day1 Div.1& F
#include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...
- 2020 CCPC Wannafly Winter Camp Day1 - I. K小数查询(分块)
题目链接:K小数查询 题意:给你一个长度为$n$序列$A$,有$m$个操作,操作分为两种: 输入$x,y,c$,表示对$i\in[x,y] $,令$A_{i}=min(A_{i},c)$ 输入$x,y ...
- 2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信
题目传送门 sol:先通过AC自动机构建字典,用$dp[i]$表示长串前$i$位的最小代价,若有一个单词$s$是长串的前$i$项的后缀,那么可以用$dp[i - len(s)] + val(s)$转移 ...
随机推荐
- 启动Eclipse提示找不到虚拟机
由于硬盘坏了,把所有东西都清光了,今天重新安装Eclipse,出现了一点小插曲 安装的时候出现了这个画面,以前安装也是照着[软件安装管家]的发布装的,幸好还懂得几个英文单词,看了一下提示信息,直译:[ ...
- MySQL学习随笔记录
安装选custmer自定义安装.默认安装全部在c盘.自定义安装的时候有个advance port选项用来选择安装目录. -----------------------MySQL常见的一些操作命令--- ...
- java高并发系列 - 第25天:掌握JUC中的阻塞队列
这是java高并发系列第25篇文章. 环境:jdk1.8. 本文内容 掌握Queue.BlockingQueue接口中常用的方法 介绍6中阻塞队列,及相关场景示例 重点掌握4种常用的阻塞队列 Queu ...
- go 学习笔记之值得特别关注的基础语法有哪些
在上篇文章中,我们动手亲自编写了第一个 Go 语言版本的 Hello World,并且认识了 Go 语言中有意思的变量和不安分的常量. 相信通过上篇文章的斐波那契数列,你已经初步掌握了 Go 语言的变 ...
- Python 面向導向語言 Object Oriented Programming Language
Pytho 是面向對象的程式語言,舉凡 Literals 值都是 Object.例如: >>> id(38)8791423739696 與 >>> id('ABC' ...
- java并发系列 - 第28天:实战篇,微服务日志的伤痛,一并帮你解决掉
这是java高并发系列第28篇文章. 环境:jdk1.8. 本文内容 日志有什么用? 日志存在的痛点? 构建日志系统 日志有什么用? 系统出现故障的时候,可以通过日志信息快速定位问题,修复bug,恢复 ...
- 浅谈Http与Https
大家都知道,在客户端与服务器数据传输的过程中,http协议的传输是不安全的,也就是一般情况下http是明文传输的.但https协议的数据传输是安全的,也就是说https数据的传输是经过加密. 在客户端 ...
- Git 实用技巧:git stash
我们经常会遇到这样的情况: 正在dev分支开发新功能,做到一半时有人过来反馈一个bug,让马上解决,但是新功能做到了一半你又不想提交,这时就可以使用git stash命令先把当前进度保存起来.然后切换 ...
- Django Mysql数据库-基于双下划线的跨表查询
一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ...
- Mysql优化(出自官方文档) - 第九篇(优化数据库结构篇)
目录 Mysql优化(出自官方文档) - 第九篇(优化数据库结构篇) 1 Optimizing Data Size 2 Optimizing MySQL Data Types 3 Optimizing ...