codeforces 8D Two Friends 二分+ 判断三个圆是否有公共交点
有两个人x, y, 现在在A点, x要直接去B点, y要先去C点在去B点, 现在给出x, y两人可以行走的最大距离T1, T2, 求出他们从A点出发之后, 可以走的最长的公共路径。
我们先看最特殊的情况, T1超级大, 所以x可以先走到C点在到B点, 这种情况的最长距离为min(T1, T2)。
然后看一般情况。 现在, x先陪y向C的方向走一段, 然后在走回B点。
我们二分走的这一段的距离。
假设距离为m, 那么我们发现, 他们两人分开的那个点, 在以A为圆心, m为半径的圆内。 同时也在以B为圆心, 半径为T1-m的圆内。 同时也在以C为圆心, T2-bc-m的圆内, bc是B C两点之间的距离。 具体的话可以画画图, 很容易看出来。
现在的问题就是看这三个圆有没有公共交点。
代码我抄的cf上面的..
#include<cstdio>
#include<cmath>
#include<complex>
#include<algorithm> using namespace std; #define point complex<double> const double eps = 1e-; double t1, t2;
point c, a, b; void readpoint(point &p) {
double x, y;
scanf("%lf %lf", &x, &y);
p = point(x, y);
} bool inter(point a, double r_a, point b, double r_b, point c, double r_c) { //以c为主圆求a b焦点判相交
if (abs(c - a) <= r_a && abs(c - b) <= r_b) return true;
b -= a; c -= a; //以a为原点
point r = point(b.real() / abs(b), b.imag() / abs(b)); //将x轴正方向置为b
b /= r; c /= r;
double d = (r_a * r_a - r_b * r_b + abs(b) * abs(b)) / ( * abs(b));
double h = sqrt(max(r_a * r_a - d * d, 0.0));
if (abs(h * h + (d - abs(b)) * (d - abs(b))) - r_b * r_b > eps) return false;
if (abs(point(d, h) - c) <= r_c || abs(point(d, -h) - c) <= r_c) return true;
return false;
} bool check(point a, double r_a, point b, double r_b, point c, double r_c) { //判断三圆是否相交
if (r_a <= eps || r_b <= eps || r_c <= eps) return false; //有空集
if (inter(a, r_a, c, r_c, b, r_b)) return true;
if (inter(b, r_b, a, r_a, c, r_c)) return true;
if (inter(c, r_c, b, r_b, a, r_a)) return true;
return false;
} int main() {
scanf("%lf %lf", &t2, &t1);
readpoint(a); readpoint(b); readpoint(c);
double T1 = t1+abs(a-b), T2 = t2+abs(a-c)+abs(c-b);
if(T1>=abs(a-c)+abs(b-c)) {
printf("%.5f\n", min(T1, T2));
return ;
}
double l = , r = min(T2, T1);
while(fabs(r-l)>eps) {
double m = (l+r)/;
if(check(a, m, b, T1-m, c, T2-abs(b-c)-m))
l = m;
else
r = m;
}
printf("%.6f\n", l);
return ;
}
codeforces 8D Two Friends 二分+ 判断三个圆是否有公共交点的更多相关文章
- CodeForces 8D Two Friends 判断三个圆相交
题意: 有两个人\(Alan\)和\(Bob\),他们现在都在\(A\)点,现在\(Bob\)想去\(B\)点,\(Alan\)想先到\(C\)点再去\(B\)点. \(Alan\)所走的总路程不能超 ...
- [Codeforces 8D] Two Friends
Brief Introduction: 有两人a.b,他们都在A点,a经过B点到C点,而b直接到C点.a走过的距离不超过la,b走过距离不超过lb,询问他们可能经过最长的公共距离. Algorithm ...
- POJ_2318_TOYS&&POJ_2398_Toy Storage_二分+判断直线和点的位置关系
POJ_2318_TOYS&&POJ_2398_Toy Storage_二分+判断直线和点的位置 Description Calculate the number of toys th ...
- python练习题-简单方法判断三个数能否组成三角形
python简单方法判断三个数能否组成三角形 #encoding=utf-8 import math while True: str=raw_input("please input thre ...
- 随机生成一份试卷,试卷的种类分为单选、多选、判断三种题型。nodejs6.0 mysql
背景:从数据库中,随机生成一份试卷,试卷的种类分为单选.多选.判断三种题型. 首先我需要生成随机数id(在这之前我需要知道数据库中各个题型的题数,这样我才能设置随机数),并依据生成的随机数id,去查找 ...
- hdu 4885 (n^2*log(n)判断三点共线建图)+最短路
题意:车从起点出发,每次只能行驶L长度,必需加油到满,每次只能去加油站或目的地方向,路过加油站就必需进去加油,问最小要路过几次加油站. 开始时候直接建图,在范围内就有边1.跑最短了,再读题后发现,若几 ...
- [Codeforces 1199C]MP3(离散化+二分答案)
[Codeforces 1199C]MP3(离散化+二分答案) 题面 给出一个长度为n的序列\(a_i\)和常数I,定义一次操作[l,r]可以把序列中<l的数全部变成l,>r的数全部变成r ...
- 实验12:Problem D: 判断两个圆之间的关系
Home Web Board ProblemSet Standing Status Statistics Problem D: 判断两个圆之间的关系 Problem D: 判断两个圆之间的关系 T ...
- Agent J(求三个圆围成的区域面积)
A - A Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit Status P ...
随机推荐
- XPath在asp.net中查询XML
.NET Framework 2.0中可以使用System.Xml.XPath命名空间下的类对XML文档进行基于路径的查询,在查询过程中需要构造类似SQL的查询字符串,该字符串遵循XPath语法.它由 ...
- .NET之反射(1)
.NET之反射 第一版 内容摘要 前言 反射 查看元数据 加载程序集 晚期绑定 方法调用 反射.晚期绑定和自定义特性的使用背景 参考资料 前言 关于反射的内容,向来是隐藏在C#高级编程类别中的大部头书 ...
- linux 日志查看总结
1 grep "ERROR" catalina.log -a 20 -b 10 查看 catalina.log 中error的唯一 一行的后20行 前10行这种情况一般要唯一确定. ...
- HDU 4415 - Assassin’s Creed
Problem Description Ezio Auditore is a great master as an assassin. Now he has prowled in the enemie ...
- 高性能PHP论坛 Carbon Forum
Carbon Forum,一个高性能的.高安全性的.基于话题的PHP轻论坛. 优秀的架构,高效的代码,每个页面平均执行时间仅为1~5毫秒,同时恰当地使用异步加载技术,在SEO与用户体验间取得平衡. 论 ...
- jchat:linux聊天程序1:简介
做一个linux的聊天软件,虽然没什么创意,但是它可以用来锻炼和测试我对网络编程的掌握程度,也借此机会做一些有意思的程序. 这里做的是linux下一个命令行的客户端与服务器的聊天程序,没写界面,因为对 ...
- opencv如何用模板匹配寻找目标
首先使用: MatchTemplate 比较模板和重叠的图像区域 void cvMatchTemplate( const CvArr* image, const CvArr* templ, CvArr ...
- Oracle EBS-SQL (WIP-7):检查当月任务发放记录.sql
select WE.DESCRIPTION 任务说明, DECODE(WE.S ...
- poj1484---判断保险丝是否烧断
题目输入要求: 2 2 10 //设备数n 接下来的操作数m 保险丝能承受最大电流c5 //电器1的电流7 //2的电流1 //反转开关12 //反转开关2 思路:设置一个flag数组,记得每次 ...
- C++面向对象编程初步
1,使用const 指针; const int * pOne; //指向整型常量的指针,指向的值不能修改; int * const pTwo; //指向整型的常量指针,指向的值可以修改,但该指针不能再 ...