HDU6097 Mindis
题目链接:https://cn.vjudge.net/problem/HDU-6097
知识点: 计算几何、圆的反演
题目大意:
已知一个圆心在原点的圆的半径,再给定 \(P, Q\) 两点坐标( \(PO=QO\),\(P, Q\) 不在圆外),在圆上取一点 \(D\),求 \(PD+QD\) 的最小值。
解题思路:
首先,\(P, Q\) 两点重合的情况要特判;
其次,\(P, Q\) 在圆上的情况也要特判(将 \(D\) 点放在 \(P\) 或 \(Q\) 点上即可,答案为 \(|PQ|\) );
最后一种情况:
先介绍一下圆的反演这个概念:
圆的反演就是对于圆\(O\)所在平面的任意一点 \(S\) ,找到一个点 \(S'\) ,使得满足以下条件:
\(1)\) \(S'\) 在直线 \(OS\) 上;
\(2)\) \(|OS||OS'| = R^2\),\(R\) 为圆的半径(由这个条件可以利用相似三角形的性质推导出反演的一个性质:对于圆上任意一点 \(P\) ,有 \(\triangle POS \sim \triangle S'OP\));
圆的反演点还有一个重要的性质:圆内的反演点在圆外,圆外的反演点在圆内,圆上的反演点是它本身。
具体可以看看这篇文章。
先求出 \(P, Q\) 的反演点 \(P', Q'\),由反演的性质易知 \(\triangle P'OD \sim \triangle DOP\),\(PD = PO*P'D/r\),同理有 \(QD = QO*Q'D/r\),则 \(PD+QD = PO/r(P'D+Q'D)\)。故我们只需求出 \(P'D+Q'D\) 的最小值即可,因为圆内的反演点在圆外,而圆外的情况是比较容易处理的。
如果 \(P'Q'\) 与圆有交点,则 \(P'D+Q'D\) 的最小值即为 \(|P'Q'|\);否则 \(D\) 取 \(P'Q'\) 的中垂线与圆的交点。
具体细节请看代码。
AC代码:
#include <bits/stdc++.h>
using namespace std;
const double eps=1e-;
int dcmp(double x){
if(fabs(x)<eps) return ;
else return x<?-:;
}
struct Point{
double x,y;
Point(double x=,double y=):x(x),y(y){}
};typedef Point Vector;
Vector operator +(Vector A,Vector B){
return Vector(A.x+B.x,A.y+B.y);
}
Vector operator -(Point A,Point B){
return Vector(A.x-B.x,A.y-B.y);
}
Vector operator *(double p,Vector A){
return Vector(A.x*p,A.y*p);
}
double Dis(Point A,Point B){//求两点距离
return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
}
double Dot(Vector A,Vector B){//求向量点积
return A.x*B.x+A.y*B.y;
}
double Length(Vector A){
return sqrt(Dot(A,A));
}
double Cross(Vector A,Vector B){
return A.x*B.y-A.y*B.x;
}
Point O;//坐标原点 Point Inver(Point a,double r){//求反演点
double dis=sqrt(a.x*a.x+a.y*a.y);
double t=r*r/dis/dis;
return Point(t*a.x,t*a.y);
}
double DistanceToLine(Point P,Point A,Point B){//求直线AB到点P的距离
Vector v1=B-A,v2=P-A;
return fabs(Cross(v1,v2))/Length(v1);
}
double cal(Point A,Point B,double r){//求直线AB的中垂线与圆的交点D,并返回|AD|+|BD|
double dis=Dis(A,O);
double ang=acos(Dot(A,B)/(dis*dis))/2.0;//利用cos<v1,v2> = v1*v2/(|v1||v2|)这条性质求两个向量的夹角的一半
return 2.0*sqrt(r*r+dis*dis-*r*dis*cos(ang));
} int main(){
// freopen("in.txt","r",stdin);
int T;
int r1,xq1,yq1,xp1,yp1;
Point P,Q,rP,rQ;
scanf("%d",&T);
while(T--){
scanf("%d",&r1);
scanf("%d%d%d%d",&xp1,&yp1,&xq1,&yq1);
P=Point((double)xp1,(double)yp1),Q=Point((double)xq1,(double)yq1);
double r=(double)r1;
if(xq1==xp1&&yq1==yp1){//特判1
printf("%.7lf\n",2.0*(r-Dis(P,O)));
continue;
}
if(xp1*xp1+yp1*yp1==r1*r1){//特判2
printf("%.7lf\n",Dis(P,Q));
continue;
}
rP=Inver(P,r),rQ=Inver(Q,r);
double d=DistanceToLine(O,rP,rQ); if(dcmp(d-r)>)
printf("%.7lf\n",cal(P,Q,r));
else
printf("%.7lf\n",Dis(P,O)/r*Dis(rP,rQ));
}
return ;
}
HDU6097 Mindis的更多相关文章
- 【计算几何】【圆反演】hdu6097 Mindis
给你一个中心在原点的圆,再给你俩在圆内且到原点距离相等的点P,Q,让你在圆上求一点D,最小化DP+DQ. http://blog.csdn.net/qq_34845082/article/detail ...
- hdu6097 Mindis(几何)
题解: 这里是用解析解的做法, 我们发现如果以P和Q做椭圆,那么当椭圆与圆相切的时候,答案最优 那么方程就是这样的 联立之后,解delta等于0,可以得到 答案就是2a了 注意不一定任何情况都有解,当 ...
- hdu 6097 Mindis(数学几何,圆心的反演点)
Mindis Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- hdu6097[二分+解析几何] 2017多校6
/*hdu6097[二分+解析几何] 2017多校6*/ #include <bits/stdc++.h> using namespace std; ; struct node{ doub ...
- 2019 年百度之星·程序设计大赛 - 初赛一 C. HDU 6670 Mindis 离散化+dijkstra
题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=6670 Mindis Time Limit: 4000/2000 MS (Java/Others) M ...
- 2017ACM暑期多校联合训练 - Team 6 1002 HDU 6097 Mindis (数学)
题目链接 Problem Description The center coordinate of the circle C is O, the coordinate of O is (0,0) , ...
- HDU 6097 Mindis (计算几何)
题意:给一个圆C和圆心O,P.Q是圆上或圆内到圆心距离相等的两个点,在圆上取一点D,求|PD| + |QD|的最小值 析:首先这个题是可以用三分过的,不过也太,.... 官方题解: 很不幸不总是中垂线 ...
- 2017多校第6场 HDU 6097 Mindis 计算几何,圆的反演
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6097 题意:有一个圆心在原点的圆,给定圆的半径,给定P.Q两点坐标(PO=QO,P.Q不在圆外),取圆 ...
- 2019 年百度之星·程序设计大赛 - 初赛一 C. Mindis 离散化+dijkstra
题目传送门 题意:中文题面 思路: 先将所有题目给出的点离散化一下,得到一张n*m的网格,n和m最大都是400,所以我们只需要枚举每个加强的区域,将属于这个区域的边处理一下(所有横着的和竖着的边,暴力 ...
随机推荐
- 外媒评Mate 10 Pro:智慧拍照惊人,续航能力卓越
说到近期的热门机型,华为Mate 10 Pro绝对算是被人们谈论最多的一个,其可以算是首款搭载移动AI芯片的顶级旗舰机型,而且AI技术在这部手机上拥有多项实际的应用,带来的体验非传统智能手机可比. 由 ...
- mock-server 之 mock 接口测试
1.mock 介绍 mock 除了用在单元测试过程中,还有一个用途,当前端开发在开发页面的时候,需要服务端提供 API 接口,此时服务端没开发完成,或者说没搭建测试环境,这个时候前端开发会自己 moc ...
- flink系列-10、flink保证数据的一致性
本文摘自书籍<Flink基础教程> 一.一致性的三种级别 当在分布式系统中引入状态时,自然也引入了一致性问题.一致性实际上是“正确性级别”的另一种说法,即在成功处理故障并恢复之后得到的结果 ...
- Linova and Kingdom(树型-贪心)
题目大意:给定一棵树,1为首都(首都可以是工业城市也可以是旅游城市),一共有n个点. 其中要选出k个工业城市,每个工业城市出一个代表去首都,其快乐值是其途径旅游城市(非工业)的个数 求所有快乐值相加的 ...
- P1353 Running S
题意:https://www.luogu.com.cn/problem/P1353 奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运动方式是每天进行 n 分钟的晨跑.在每分钟的开始 ...
- M - Little Pony and Harmony Chest 状压dp
M - Little Pony and Harmony Chest 怎么感觉自己越来越傻了,都知道状态的定义了还没有推出转移方程. 首先这个a的范围是0~30 这里可以推出 b数组的范围 0~60 ...
- P2765 魔术球问题 网络流二十四题重温
P2765 魔术球问题 知识点::最小点覆盖 这个题目要拆点,这个不是因为每一个球只能用一次,而是因为我们要求最小点覆盖,所以要拆点来写. 思路: 首先拆点,然后就是开始建边,因为建边的条件是要求他们 ...
- spring Code(spring 核心)
一.spring的作用 spring 就是为了让我们以后能够做大的项目准备的.spring核心的功能就是一个工厂模式,spring相当于为你的项目专门成立一个一个工厂,这个工厂负责创建对象 ,维护对象 ...
- Python Web实战:Python+Django+MySQL实现基于Web版的增删改查
前言 本篇使用Python Web框架Django连接和操作MySQL数据库学生信息管理系统(SMS),主要包含对学生信息增删改查功能,旨在快速入门Python Web,少走弯路.效果演示在项目实战最 ...
- 海外网站如何通过代理IP进行采集?
海外网站如何通过代理IP进行采集? 我们在做爬虫的时候,经常会遇到这种情况,爬虫最初运行的时候,数据是可以正常获取的,一切看起来都那么的美好,然而,不一会儿,就可能会出现403 Forbidden , ...