Gym - 101617F :Move Away (圆的交点)
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 (圆的交点)的更多相关文章
- HDU 5572--An Easy Physics Problem(射线和圆的交点)
An Easy Physics Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- 简单几何(直线与圆的交点) ZOJ Collision 3728
题目传送门 题意:有两个一大一小的同心圆,圆心在原点,大圆外有一小圆,其圆心有一个速度(vx, vy),如果碰到了小圆会反弹,问该圆在大圆内运动的时间 分析:将圆外的小圆看成一个点,判断该直线与同心圆 ...
- 2D空间中求线段与圆的交点
出处: https://answers.unity.com/questions/366802/get-intersection-of-a-line-and-a-circle.html 测试脚本(返回值 ...
- 2D空间中求两圆的交点
出处:https://stackoverflow.com/questions/19916880/sphere-sphere-intersection-c-3d-coordinates-of-colli ...
- Gym 100342F Move to Front (树状数组动态维护和查询)
用树状数组动态和查询修改排名. 树状数组可以很方便地查询前缀和,那么可以利用这一特点,记录一个点在树状数组里最后一次出现的位置, 查询出这个位置,就可以知道这个点的排名了.更改这个点的排名的时候只要把 ...
- matlab练习程序(多圆交点)
最近总是对计算几何方面的程序比较感兴趣. 多圆求交点,要先对圆两两求交点. 有交点的圆分为相切圆和相交圆. 相切圆求法: 1.根据两圆心求直线 2.求公共弦直线方程 3.求两直线交点即两圆切点. 相交 ...
- Gym-101915B Ali and Wi-Fi 计算几何 求两圆交点
题面 题意:给你n个圆,每个圆有一个权值,你可以选择一个点,可以获得覆盖这个点的圆中,权值最大的m个的权值,问最多权值是多少 题解:好像是叙利亚的题....我们画画图就知道,我们要找的就是圆与圆交的那 ...
- Gym 101915
Gym - 101915A Printing Books 题意:有一本书,从第X页开始,一共用了n位数字,求此书一共多少页.99就是两位数字,100就是三位数字. 思路:直接模拟即可,我用了一个hi ...
- hdu4063(圆与圆交+线段与圆交+最短路)
写几何题总是提心吊胆.精度问题真心吓人. 其实思路挺简单的一道题,真是什么算法和几何double搞到一块,心里就虚虚的. 思路:求出所有圆之间的交点,然后用这些交点跑一遍最短路就可以了. Aircra ...
随机推荐
- opencv学习之路(25)、轮廓查找与绘制(四)——正外接矩形
一.简介 二.外接矩形的查找绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //外接矩形的查找 ...
- 剑指offer(37)数字在排序数组中出现的次数。
题目描述 统计一个数字在排序数组中出现的次数. 题目分析 这题用暴力解也可以过,不过面试官肯定期待更好的解法. 查找我们最熟悉的就是二分查找了,不过二分查找查找的数在数组中只有一个,我们这里却有很多个 ...
- win10更新后 chrome内核浏览器总是打开网页一直加载 甚至打不开 解决方法
https://blog.csdn.net/qq754772661/article/details/81452131 升级win10之后如果出现chrome内核的浏览器网页总是打不开 打开很慢 而ie ...
- mysql常用的查询优化
原文链接:https://www.jb51.net/article/39221.htm 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2 ...
- ado.net 批量添加 更新 删除
自曾列就别往下看 别折腾了 使用 SqlBulkCopy ,dataTable 必须跟sql里面的表字段完全一样 下面在sqlserver中演示 mysql 请google MySqlBulkLo ...
- Java Deque 队列 栈
垃圾JDK啊 Deque这个接口,既承担着FIFO的任务,即队列,也承担着LIFO的任务,即栈 目前jdk里面实现了这个接口的类有两个,一个是ArrayDeque,另一个是LinkedList 但是由 ...
- pycurl安装
pip install pycurl 出现:Could not run curl-config: [Errno 2] No such file or directory: 'curl-config': ...
- 更改npm淘宝源,并设置cnpm
一.通过命令配置1. 命令 npm config set registry https://registry.npm.taobao.org2. 验证命令 npm config get registry ...
- 整合MyBatis(springboot)
pom文件: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>m ...
- 『TensorFlow』SSD源码学习_其二:基于VGG的SSD网络前向架构
Fork版本项目地址:SSD 参考自集智专栏 一.SSD基础 在分类器基础之上想要识别物体,实质就是 用分类器扫描整张图像,定位特征位置 .这里的关键就是用什么算法扫描,比如可以将图片分成若干网格,用 ...