pro:给定N个圆,求离原点最远的点,满足它在N个圆里。输出这个距离。N<50;

sol:关键点一定是圆与圆的交点。 圆与 圆心到原点的直线 的交点。 然后去验证这些关键点是否在N个圆内。 实际操作的时候需要考虑一些条件:

1,求圆的交点的时候,先判断是否内含或者相离。

2,求直线与圆的交点的时候,先判断是否圆心就在原点处。

3,有可能不存在相交的圆。

如何求圆与圆的交点:

用atan2求出t,余弦定理求出a,即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const double eps=1e-;
const double pi=acos(-1.0);
struct point{
double x,y;
point(){}
point(double xx,double yy):x(xx),y(yy){}
};
struct Circle{
point c;
double r;
};
point operator +(point a,point b){ return point(a.x+b.x,a.y+b.y);}
point operator -(point a,point b){ return point(a.x-b.x,a.y-b.y);}
point operator *(point a,double p){return point(a.x*p,a.y*p);}
point operator /(point a,double p){ return point(a.x/p,a.y/p);}
double dot(point a,point b){ return a.x*b.x+a.y*b.y;}
double det(point a,point b){ return a.x*b.y-a.y*b.x;}
Circle C[maxn]; point P[maxn]; int tot,N; double ans1,ans2;
void CirintersectCir(Circle A,Circle B)
{
point L=B.c-A.c;
double dis=sqrt(dot(L,L));
if(dis>A.r+B.r||fabs(A.r-B.r)>=dis+eps) return ;
double angle1=atan2(L.y,L.x);
double angle2=acos((A.r*A.r+dis*dis-B.r*B.r)/(*A.r*dis));
P[++tot]=point(A.c.x+A.r*cos(angle1+angle2),A.c.y+A.r*sin(angle1+angle2));
P[++tot]=point(A.c.x+A.r*cos(angle1-angle2),A.c.y+A.r*sin(angle1-angle2));
}
void OtoCir(Circle A)
{
double dis=sqrt(dot(A.c,A.c));
P[++tot]=A.c+A.c*A.r/dis;
}
int fcy=; double R;
bool check(point p)
{
rep(i,,N)
if(sqrt(dot(p-C[i].c,p-C[i].c))>C[i].r+eps) return false;
if(fcy&&sqrt(dot(p,p))>R+eps) return false;
return true;
}
int main()
{
scanf("%d",&N);
rep(i,,N){
scanf("%lf%lf%lf",&C[i].c.x,&C[i].c.y,&C[i].r);
if(C[i].c.x==0.0&&C[i].c.y==0.0) {
if(fcy==) fcy=,R=C[i].r;
else R=min(R,C[i].r);
if(ans1==) ans1=C[i].r;
else ans2=min(ans2,C[i].r);
i--; N--;
}
}
if(fcy){
Circle T; T.r=R; T.c.x=T.c.y=;
rep(i,,N){
P[++tot]=C[i].c/sqrt(dot(C[i].c,C[i].c))*R;
CirintersectCir(T,C[i]);
}
}
rep(i,,N)
rep(j,i+,N)
CirintersectCir(C[i],C[j]);
rep(i,,N) OtoCir(C[i]);
rep(i,,tot)
if(check(P[i]))
ans2=max(ans2,sqrt(dot(P[i],P[i])));
if(ans2!=0.0) printf("%.3lf\n",ans2);
else printf("%.3lf\n",ans1);
return ;
}

Gym - 101617F :Move Away (圆的交点)的更多相关文章

  1. HDU 5572--An Easy Physics Problem(射线和圆的交点)

    An Easy Physics Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  2. 简单几何(直线与圆的交点) ZOJ Collision 3728

    题目传送门 题意:有两个一大一小的同心圆,圆心在原点,大圆外有一小圆,其圆心有一个速度(vx, vy),如果碰到了小圆会反弹,问该圆在大圆内运动的时间 分析:将圆外的小圆看成一个点,判断该直线与同心圆 ...

  3. 2D空间中求线段与圆的交点

    出处: https://answers.unity.com/questions/366802/get-intersection-of-a-line-and-a-circle.html 测试脚本(返回值 ...

  4. 2D空间中求两圆的交点

    出处:https://stackoverflow.com/questions/19916880/sphere-sphere-intersection-c-3d-coordinates-of-colli ...

  5. Gym 100342F Move to Front (树状数组动态维护和查询)

    用树状数组动态和查询修改排名. 树状数组可以很方便地查询前缀和,那么可以利用这一特点,记录一个点在树状数组里最后一次出现的位置, 查询出这个位置,就可以知道这个点的排名了.更改这个点的排名的时候只要把 ...

  6. matlab练习程序(多圆交点)

    最近总是对计算几何方面的程序比较感兴趣. 多圆求交点,要先对圆两两求交点. 有交点的圆分为相切圆和相交圆. 相切圆求法: 1.根据两圆心求直线 2.求公共弦直线方程 3.求两直线交点即两圆切点. 相交 ...

  7. Gym-101915B Ali and Wi-Fi 计算几何 求两圆交点

    题面 题意:给你n个圆,每个圆有一个权值,你可以选择一个点,可以获得覆盖这个点的圆中,权值最大的m个的权值,问最多权值是多少 题解:好像是叙利亚的题....我们画画图就知道,我们要找的就是圆与圆交的那 ...

  8. Gym 101915

    Gym - 101915A  Printing Books 题意:有一本书,从第X页开始,一共用了n位数字,求此书一共多少页.99就是两位数字,100就是三位数字. 思路:直接模拟即可,我用了一个hi ...

  9. hdu4063(圆与圆交+线段与圆交+最短路)

    写几何题总是提心吊胆.精度问题真心吓人. 其实思路挺简单的一道题,真是什么算法和几何double搞到一块,心里就虚虚的. 思路:求出所有圆之间的交点,然后用这些交点跑一遍最短路就可以了. Aircra ...

随机推荐

  1. ubuntu 16.04 tip

    参考 1. 安装 python3.6 sudo add-apt-repository ppa:jonathonf/python-3.6  sudo apt-get update sudo apt-ge ...

  2. Codeforces 1045B Space Isaac - 数论 - Hash

    题目传送门 传送门I 传送门II 传送门III 题目大意 给定将$\left \{ 0, 1, \dots, m - 1\right \}$分成了不相交的两个非空集合$A$和$B$,给定$A$,问存在 ...

  3. tomcat的Server.xml详解和Host的配置

    基于以下说法的领悟: 若只配appBase,不配Context 的docBase(appBase和docBase二选一就可以了),则appBase的每个文件夹里都代表一个应用,每个应用都必须放ROOT ...

  4. UVA11997 K Smallest Sums

    思路 经典的k路归并问题 问题先转换为2路的有序表归并 先让A[1~k]都和B[1]相加,然后加入堆中,取出堆顶(A[x]+B[y])之后,再放入A[x]+B[y+1] 代码 #include < ...

  5. VisualSFM使用记录1 unable to load libsiftgpu.so

    官网:http://ccwu.me/vsfm/(解决过程蓝色字,问题原因解决方法红色字)SFM computer missing match阶段运行出现错误 More than 189MB of gr ...

  6. 【Luogu P2664】树上游戏

    Problem Description \(lrb\) 有一棵树,树的每个节点有个颜色.给一个长度为 \(n\) 的颜色序列,定义 \(s(i,j)\) 为 \(i\) 到 \(j\) 的颜色数量.以 ...

  7. mysql数据库连接出问题,提示超时 java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.解决办法

    mysql数据库连接出问题,提示超时,后来发现问题在于连接mysql数据库的jar包跟数据库版本不对应导致的,更换jar包一致就解决了.

  8. cmd 查看端口

    windows + R 调出cmd窗口 输入 netstat -nao 查看端口使用情况 输入netstat -nao | findstr 80查找指定端口 杀死指定端口的进程taskkill /pi ...

  9. linux服务器查看项目日志命令

    1.tailf mywork.log | grep --line-buffered findUserList      实时跟踪日志,这里是只要findUserList 这个方法被运行,就会将它的日志 ...

  10. 百度echarts 3.0版本和2.0版本的兼容问题

    前一段时间,项目中要用到统计图表,之前也用过jqplot的图表插件,这次开发的内容中基于地图的展示还很多,所以后来选择了百度的echarts插件(echarts.baidu.com).刚开始用的时候, ...