题目链接

有两个人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 二分+ 判断三个圆是否有公共交点的更多相关文章

  1. CodeForces 8D Two Friends 判断三个圆相交

    题意: 有两个人\(Alan\)和\(Bob\),他们现在都在\(A\)点,现在\(Bob\)想去\(B\)点,\(Alan\)想先到\(C\)点再去\(B\)点. \(Alan\)所走的总路程不能超 ...

  2. [Codeforces 8D] Two Friends

    Brief Introduction: 有两人a.b,他们都在A点,a经过B点到C点,而b直接到C点.a走过的距离不超过la,b走过距离不超过lb,询问他们可能经过最长的公共距离. Algorithm ...

  3. POJ_2318_TOYS&&POJ_2398_Toy Storage_二分+判断直线和点的位置关系

    POJ_2318_TOYS&&POJ_2398_Toy Storage_二分+判断直线和点的位置 Description Calculate the number of toys th ...

  4. python练习题-简单方法判断三个数能否组成三角形

    python简单方法判断三个数能否组成三角形 #encoding=utf-8 import math while True: str=raw_input("please input thre ...

  5. 随机生成一份试卷,试卷的种类分为单选、多选、判断三种题型。nodejs6.0 mysql

    背景:从数据库中,随机生成一份试卷,试卷的种类分为单选.多选.判断三种题型. 首先我需要生成随机数id(在这之前我需要知道数据库中各个题型的题数,这样我才能设置随机数),并依据生成的随机数id,去查找 ...

  6. hdu 4885 (n^2*log(n)判断三点共线建图)+最短路

    题意:车从起点出发,每次只能行驶L长度,必需加油到满,每次只能去加油站或目的地方向,路过加油站就必需进去加油,问最小要路过几次加油站. 开始时候直接建图,在范围内就有边1.跑最短了,再读题后发现,若几 ...

  7. [Codeforces 1199C]MP3(离散化+二分答案)

    [Codeforces 1199C]MP3(离散化+二分答案) 题面 给出一个长度为n的序列\(a_i\)和常数I,定义一次操作[l,r]可以把序列中<l的数全部变成l,>r的数全部变成r ...

  8. 实验12:Problem D: 判断两个圆之间的关系

    Home Web Board ProblemSet Standing Status Statistics   Problem D: 判断两个圆之间的关系 Problem D: 判断两个圆之间的关系 T ...

  9. Agent J(求三个圆围成的区域面积)

    A - A Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status P ...

随机推荐

  1. XPath在asp.net中查询XML

    .NET Framework 2.0中可以使用System.Xml.XPath命名空间下的类对XML文档进行基于路径的查询,在查询过程中需要构造类似SQL的查询字符串,该字符串遵循XPath语法.它由 ...

  2. .NET之反射(1)

    .NET之反射 第一版 内容摘要 前言 反射 查看元数据 加载程序集 晚期绑定 方法调用 反射.晚期绑定和自定义特性的使用背景 参考资料 前言 关于反射的内容,向来是隐藏在C#高级编程类别中的大部头书 ...

  3. linux 日志查看总结

    1 grep "ERROR" catalina.log -a 20 -b 10 查看 catalina.log 中error的唯一 一行的后20行 前10行这种情况一般要唯一确定. ...

  4. HDU 4415 - Assassin’s Creed

    Problem Description Ezio Auditore is a great master as an assassin. Now he has prowled in the enemie ...

  5. 高性能PHP论坛 Carbon Forum

    Carbon Forum,一个高性能的.高安全性的.基于话题的PHP轻论坛. 优秀的架构,高效的代码,每个页面平均执行时间仅为1~5毫秒,同时恰当地使用异步加载技术,在SEO与用户体验间取得平衡. 论 ...

  6. jchat:linux聊天程序1:简介

    做一个linux的聊天软件,虽然没什么创意,但是它可以用来锻炼和测试我对网络编程的掌握程度,也借此机会做一些有意思的程序. 这里做的是linux下一个命令行的客户端与服务器的聊天程序,没写界面,因为对 ...

  7. opencv如何用模板匹配寻找目标

    首先使用: MatchTemplate 比较模板和重叠的图像区域 void cvMatchTemplate( const CvArr* image, const CvArr* templ, CvArr ...

  8. Oracle EBS-SQL (WIP-7):检查当月任务发放记录.sql

    select        WE.DESCRIPTION                                                任务说明,        DECODE(WE.S ...

  9. poj1484---判断保险丝是否烧断

    题目输入要求: 2 2 10 //设备数n  接下来的操作数m   保险丝能承受最大电流c5 //电器1的电流7 //2的电流1 //反转开关12 //反转开关2 思路:设置一个flag数组,记得每次 ...

  10. C++面向对象编程初步

    1,使用const 指针; const int * pOne; //指向整型常量的指针,指向的值不能修改; int * const pTwo; //指向整型的常量指针,指向的值可以修改,但该指针不能再 ...