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 ...
随机推荐
- Http权威指南笔记(一) URI URL URN 关系
定义 URI:统一资源标识符(Uniform Resource Indentifier)用来标识服务器上的资源. URL:统一资源定位符(Uniform Resouce Locator)是资源标识符最 ...
- Linux命令--链接文件的那些事
linux 链接ln的使用 linux操作系统下ln的使用方式: ln [option] source_file dest_file #source_file是待建立链接文件的文件,dest_file ...
- redhat系列yum本地源配置
1.挂载光盘,本示例挂载在/mnt下. 2.清除系统带的.repo文件,rm -f /etc/yum.repos.d/* 3.编辑自己的repo文件,内容如下: [local_server] (库 ...
- 获取Json对象的长度或计数
最近又开始写博客了.因为最近的工作又开始与技术方面接口了.现在在开发WEB的时候,经常会遇到JSON对象的传递,JSON是个好东西,但是它却没有提供一些简单便捷的处理方法,其中获取JSON对象的长度就 ...
- Hibernate的Criteria用法
在hibernate的Session里面使用createCriteria可以创建一个Criteria实例帮助我们进行条件查询,不用自己串hql语句,很方便. 用法很简单,首先传Class实例创建Cri ...
- FLASH MAGIC LPC ISP下载方式说明
硬件:EASYARM2131 开发板软件:FLASH MAGIC 下载地址:http://www.flashmagictool.com/程序:Demo2131.hex LPC的ISP下载方式, ...
- C++ dynamic_cast实现原理
dynamic_cast是一个操作符,其用法不再赘述.查看汇编码可以发现实际调用的是这个函数__RTDynamicCast,其内部实现如下: rtti.h: #pragma once extern & ...
- docker网络-如何让外部网络访问容器资源
docker网络-如何让外部网络访问容器资源 安装httpd 服务: docker:/root# docker exec -it f63b2633d146 bash bash-4.1# yum ins ...
- Ajax学习教程在线阅读
1.什么是AJAX ?(1) 2.什么是AJAX ?(2) 3.什么是AJAX ?(3) 4.什么是AJAX ?(4) 5.Ajax基础教程(1)-Ajax简介 1.1 Web应用简史 6.Aja ...
- PHPExcel Fatal error: ZipArchive library is not enabled
导致上述问题的可能性有两种: 1.没开启php_zip.dll扩展 a.在Windows下的解决办法是: (a1) 在php.ini文件中,将extension=php_zip.dll前面的分号“; ...