dijkstra

已经提交 已经通过

42.86%

Total Submission:189

Total Accepted:81

题目描述

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=ri​2。角色在直线上、圆上、圆内行走不消耗体力。在其他位置上由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 即算正确。

样例输入 1

  1. 2 0 1 0 -4
  2. 0 1 1
  3. 1 3 1

样例输出 1

  1. 0.236068
  2.  
  3. 题意:给定两个平行的直线,直线中间有若干个圆,点在直线和圆上行走不消耗能力。问从第一条直线走到第二条直线最小需要消耗多少能量。
    距离即代表消耗的能力。
    思路:
    1、首先处理每一个圆心到其他圆心和直线的距离,以各个圆心点和直线缩成点构成一个图,然后根据距离跑最短路算法即可。
    2、注意距离减去半径的时候如果是负数要赋值为0
    细节见我的代码;
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <queue>
  7. #include <map>
  8. #include <set>
  9. #include <vector>
  10. #define rep(i,x,n) for(int i=x;i<n;i++)
  11. #define repd(i,x,n) for(int i=x;i<=n;i++)
  12. #define pii pair<int,int>
  13. #define pll pair<long long ,long long>
  14. #define gbtb std::ios::sync_with_stdio(false)
  15. #define MS0(X) memset((X), 0, sizeof((X)))
  16. #define MSC0(X) memset((X), '\0', sizeof((X)))
  17. #define pb push_back
  18. #define mp make_pair
  19. #define fi first
  20. #define se second
  21. #define gg(x) getInt(&x)
  22. using namespace std;
  23. typedef long long ll;
  24. inline void getInt(int* p);
  25. /*** TEMPLATE CODE STARTS HERE ***/
  26. const int maxn=;
  27. const int INF= 0x3f3f3f3f;
  28. struct Node
  29. {
  30. int to;
  31. double dist;
  32. Node(){}
  33. Node(int _n,double _d)
  34. {
  35. to=_n;
  36. dist=_d;
  37. }
  38. bool operator < (const Node x ) const
  39. {
  40. return dist > x.dist;
  41. }
  42. };
  43. priority_queue<Node> heap;
  44. vector <Node> Map[maxn];
  45. double dis[maxn];
  46. int t,n,star;
  47. void dijkstra (int strat)
  48. {
  49. // memset(dis,INF,sizeof(dis));
  50. repd(i,,maxn-)
  51. {
  52. dis[i]=9999999999.0;
  53. }
  54. dis[strat]=;
  55. heap.push(Node(strat,dis[strat]));
  56. while(!heap.empty())
  57. {
  58. Node x= heap.top();
  59. heap.pop();
  60. int LEN=Map[x.to].size();
  61. rep(i,,LEN)
  62. {
  63. Node now =Map[x.to][i];
  64. if(dis[now.to]>x.dist+now.dist)
  65. {
  66. dis[now.to]=x.dist+now.dist;
  67. heap.push(Node(now.to,dis[now.to]));
  68. }
  69. }
  70. }
  71.  
  72. }
  73. int a,b,c1,c2;
  74. struct yuan
  75. {
  76. int x,r,y;
  77. }y[maxn];
  78. double getdis(int id)
  79. {
  80. double res=0.00000;
  81. res=max(0.000,fabs(a*y[id].x+b*y[id].y+c1)*1.000/sqrt(a*a+b*b));
  82. return res;
  83.  
  84. }
  85. double getdis2(int id)
  86. {
  87. double res=0.00000;
  88. res=max(0.00,fabs(a*y[id].x+b*y[id].y+c2)*1.000/sqrt(a*a+b*b));
  89. return res;
  90.  
  91. }
  92. int main()
  93. {
  94. // scanf("%d %d %d",&n,&t,&star);
  95. // int a,b,d;
  96. // repd(i,1,t)
  97. // {
  98. // scanf("%d %d %d",&a,&b,&d);
  99. // Map[a].pb(Node(b,d));
  100. // // Map[b].pb(Node(a,d));
  101. // }
  102. // dijkstra(star);
  103. // printf("%d\n",ans);
  104. gg(n);
  105. gg(a);gg(b);gg(c1);gg(c2);
  106. repd(i,,n+)
  107. {
  108. gg(y[i].x);
  109. gg(y[i].y);
  110. gg(y[i].r);
  111. }
  112. repd(i,,n+)
  113. {
  114. double dt=max(getdis(i)-y[i].r,0.00);
  115. Map[].push_back(Node(i,dt));
  116. Map[i].push_back(Node(,dt));
  117. }
  118. repd(i,,n+)
  119. {
  120. double dt=max(getdis2(i)-y[i].r,0.00);
  121. Map[].push_back(Node(i,dt));
  122. Map[i].push_back(Node(,dt));
  123. }
  124. repd(i,,n+)
  125. {
  126. repd(j,,n+)
  127. {
  128. if(i==j)
  129. {
  130. continue;
  131. }else
  132. {
  133. double dt=max(0.000,-y[i].r-y[j].r+sqrt((y[i].x-y[j].x)*(y[i].x-y[j].x)+(y[i].y-y[j].y)*(y[i].y-y[j].y)));
  134. Map[i].push_back(Node(j,dt));
  135. Map[j].push_back(Node(i,dt));
  136. }
  137. }
  138. }
  139. dijkstra();
  140. printf("%.6lf\n",dis[] );
  141. return ;
  142. }
  143.  
  144. inline void getInt(int* p) {
  145. char ch;
  146. do {
  147. ch = getchar();
  148. } while (ch == ' ' || ch == '\n');
  149. if (ch == '-') {
  150. *p = -(getchar() - '');
  151. while ((ch = getchar()) >= '' && ch <= '') {
  152. *p = *p * - ch + '';
  153. }
  154. }
  155. else {
  156. *p = ch - '';
  157. while ((ch = getchar()) >= '' && ch <= '') {
  158. *p = *p * + ch - '';
  159. }
  160. }
  161. }
  1.  

Comet OJ 热身赛(E题)(处理+最短路算法)的更多相关文章

  1. Comet OJ 热身赛(K题)principal(括号匹配问题+stack模拟)

    principal 已经提交 已经通过 23.66% Total Submission:131 Total Accepted:31 题目描述 阿尔比恩王国潜伏着代号白鸽队''的一群间谍.在没有任务的时 ...

  2. Comet OJ 热身赛-principal

    这题的话,我们分析一下,入栈的操作是: 栈空 栈顶元素和当前操作元素不属于同一类括号 栈顶元素和当前操作元素属于同一类括号,但是并不是左括号在前,右括号在后 上面三个条件有任意一个满足都应该入栈,如果 ...

  3. isaster(Comet OJ - Contest #11D题+kruskal重构树+线段树+倍增)

    目录 题目链接 思路 代码 题目链接 传送门 思路 \(kruskal\)重构树\(+\)线段树\(+\)倍增 代码 #include <set> #include <map> ...

  4. Comet OJ - Contest #4--前缀和

    原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...

  5. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  6. Comet OJ 计算机(computer)

    Comet OJ 计算机(computer) 题目传送门 题目描述 小 X 有一台奇怪的计算机. 这台计算机首先会读入一个正整数 nn,然后生成一个包含 nn 个数的序列 aa. 一开始 a_i(1 ...

  7. Comet OJ - Contest #13-C2

    Comet OJ - Contest #13-C2 C2-佛御石之钵 -不碎的意志-」(困难版) 又是一道并查集.最近做过的并查集的题貌似蛮多的. 思路 首先考虑,每次处理矩形只考虑从0变成1的点.这 ...

  8. Comet OJ 2019 夏季欢乐赛题解

    Comet OJ 2019 夏季欢乐赛题解 我是来骗访问量的 A 完全k叉树 \(n\)个点的完全k叉树的直径. 直接做 B 距离产生美 直接做 C 烤面包片 \(n!!!\mod p\) 显然\(n ...

  9. Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」

    来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...

随机推荐

  1. c/c++ 重载运算符的思考

    c/c++ 重载运算符的思考 #include <iostream> using namespace std; class Imaginary{ public: Imaginary():r ...

  2. Windows Server 2016-Powershell管理站点复制

    对于Active Directory的Windows PowerShell包括管理复制.网站.域和森林,域控制器以及分区的能力.例如Active Directory的站点和服务管理单元和repadmi ...

  3. rem自适应

    //REM自适应 _resize(); window.addEventListener('resize', _resize, false); function _resize() { var devi ...

  4. pip freeze 打包依赖库及setup.py

    需要打包的工程目录下使用命令: pip freeze > requirements.txt 就会在pip目录生成 requirements.txt 文件,该文件内就是当前环境所安装的所有扩展包打 ...

  5. [matlab] 4.M函数

    函数文件的编写 新建一个函数文件 函数的第一行的格式 :function [输出的参数] =函数名 (输入的参数) 输入和输出的参数可以有多个 保存函数文件的时候,注意文件名要和函数名一样 函数头和函 ...

  6. 《JAVA程序设计》_第一周学习总结

    20175217吴一凡 <java程序设计> 第一周学习总结 虽然已经做好了心理准备,但第一周的学习任务着实让我忙了整整三天,还是挺充实的吧.寒假已经在自己的电脑上安装好了虚拟机,我就在我 ...

  7. [转]Oracle 清除incident和trace -- ADRCI用法

    在oracle11g中,dump file的目录已经有所改变,bdump和udump整合到trace中,cdump独立出一个. E:\ora11g\app\Administrator\diag\rdb ...

  8. 【转】编写微信聊天机器人4《聊天精灵WeChatGenius》:实时获取到微信聊天消息,hook数据库插入操作。

    接上篇,使用Xposed来hook微信,找到微信进程:https://blog.csdn.net/weixin_42127613/article/details/81839537 既然已经找到了微信进 ...

  9. Spring Security(二):一、Preface(前言)

    Spring Security is a powerful and highly customizable authentication and access-control framework. I ...

  10. 初学Python——字典

    一.定义 什么是字典? 字典是一种数据类型,是一系列数据的组合. 每一个数据单元都分为key和value,key也称主键,具有唯一性,不可重复.value可以理解成是key对应的值. info={ 1 ...