hdu 3694 10 福州 现场 E - Fermat Point in Quadrangle 费马点 计算几何 难度:1
Alice and Bob are learning geometry. Recently they are studying about the Fermat Point.
Alice: I wonder whether there is a similar point for quadrangle.
Bob: I think there must exist one.
Alice: Then how to know where it is? How to prove?
Bob: I don’t know. Wait… the point may hold the similar property as the case in triangle.
Alice: It sounds reasonable. Why not use our computer to solve the problem? Find the Fermat point, and then verify your assumption.
Bob: A good idea.
So they ask you, the best programmer, to solve it. Find the Fermat point for a quadrangle, i.e. find a point such that the total distance from the four vertices of the quadrangle to that point is the minimum.
Input
Each test case is a single line which contains eight float numbers, and it is formatted as below:
x 1 y 1 x 2 y 2 x 3 y 3 x 4 y 4
x i, y i are the x- and y-coordinates of the ith vertices of a quadrangle. They are float numbers and satisfy 0 ≤ x i ≤ 1000 and 0 ≤ y i ≤ 1000 (i = 1, …, 4).
The input is ended by eight -1.
Output
Sample Input
1 1 1 1 1 1 1 1
-1 -1 -1 -1 -1 -1 -1 -1
四边形费马点
平面四边形费马点证明图形
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std; const double eps=1e-10; double add(double a,double b)
{
if(abs(a+b)<eps*(abs(a)+abs(b))) return 0;
return a+b;
} struct point
{
double x,y;
point () {}
point (double x,double y) : x(x),y(y){ }
point operator + (point p)
{
return point (add(x,p.x),add(y,p.y));
}
point operator - (point p)
{
return point (add(x,-p.x),add(y,-p.y));
}
point operator * (double d)
{
return point (x*d,y*d);
}
double dot(point p)
{
return add(x*p.x,y*p.y);
}
double det(point p)
{
return add(x*p.y,-y*p.x);
}
}; bool on_seg(point p1,point p2,point q)
{
return (p1-q).det(p2-q)==0&&(p1-q).dot(p2-q)<=0;
} point intersection(point p1,point p2,point q1,point q2)
{
return p1+(p2-p1)*((q2-q1).det(q1-p1)/(q2-q1).det(p2-p1));
} bool cmp_x(const point&p,const point& q)
{
if(p.x!=q.x) return p.x<q.x;
return p.y<q.y;
} vector<point> convex_hull(point*ps,int n)
{
sort(ps,ps+n,cmp_x);
//for(int i=0;i<n;i++) printf("x=%.f %.f")
int k=0;
vector<point> qs(n*2);
for(int i=0;i<n;i++){
while(k>1&&(qs[k-1]-qs[k-2]).det(ps[i]-qs[k-1])<=0) k--;
qs[k++]=ps[i];
}
for(int i=n-2,t=k;i>=0;i--){
while(k>t&&(qs[k-1]-qs[k-2]).det(ps[i]-qs[k-1])<=0) k--;
qs[k++]=ps[i];
}
qs.resize(k-1);
return qs;
} double dis(point p1,point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
bool equ(point p1,point p2)
{
if(fabs(p1.x-p2.x)<eps&&fabs(p1.y-p2.y)<eps)
return true;
return false;
}
int main()
{
point p[10];
for(int i=0;i<4;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
while(p[0].x!=-1&&p[0].y!=-1)
{
vector <point> m;
double minn=100000000,d;
m=convex_hull(p,4);//检查是否四边形
if(m.size()==4)//如果是四边形则加入对角线交点考虑
minn=dis(m[1],m[3])+dis(m[0],m[2]);
for(int i=0;i<4;i++)
{
d=0;
for(int j=0;j<4;j++)
d+=dis(p[i],p[j]);
minn=min(minn,d);
}
printf("%.4f\n",minn);
for(int i=0;i<4;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
}
return 0;
}
hdu 3694 10 福州 现场 E - Fermat Point in Quadrangle 费马点 计算几何 难度:1的更多相关文章
- hdu 3695 10 福州 现场 F - Computer Virus on Planet Pandora 暴力 ac自动机 难度:1
F - Computer Virus on Planet Pandora Time Limit:2000MS Memory Limit:128000KB 64bit IO Format ...
- hdu 3697 10 福州 现场 H - Selecting courses 贪心 难度:0
Description A new Semester is coming and students are troubling for selecting courses. Students ...
- hdu 3699 10 福州 现场 J - A hard Aoshu Problem 暴力 难度:0
Description Math Olympiad is called “Aoshu” in China. Aoshu is very popular in elementary schools. N ...
- hdu 3696 10 福州 现场 G - Farm Game DP+拓扑排序 or spfa+超级源 难度:0
Description “Farm Game” is one of the most popular games in online community. In the community each ...
- hdu 3682 10 杭州 现场 C - To Be an Dream Architect 简单容斥 难度:1
C - To Be an Dream Architect Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d &a ...
- hdu 3685 10 杭州 现场 F - Rotational Painting 重心 计算几何 难度:1
F - Rotational Painting Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
- hdu 3682 10 杭州 现场 C To Be an Dream Architect 容斥 难度:0
C - To Be an Dream Architect Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d &a ...
- hdu 3687 10 杭州 现场 H - National Day Parade 水题 难度:0
H - National Day Parade Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
- hdu 4770 13 杭州 现场 A - Lights Against Dudely 暴力 bfs 状态压缩DP 难度:1
Description Harry: "But Hagrid. How am I going to pay for all of this? I haven't any money.&quo ...
随机推荐
- github push error ---- recursion detected in die handler
错误提示如下: 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 New Bitmap Image.bmp Coun ...
- Mirror--自增键在镜像中的影响
测试环境: OS: Windows Server 2008 R2 Enterprise SQL: SQL Server 2012 Enterprise 测试场景: 有SERVER A上数据库 DB10 ...
- EOS 的网站及资料doc
https://github.com/EOSIO/Documentation/blob/master/zh-CN/Roadmap.md https://bytemaster.github.io/bit ...
- Flask系列之源码分析(一)
目录: 涉及知识点 Flask框架原理 简单示例 路由系统原理源码分析 请求流程简单源码分析 响应流程简单源码分析 session简单源码分析 涉及知识点 1.装饰器 闭包思想 def wapper( ...
- Randcher 2.0部署K8s集群(一)
环境准备 1.系统版本 CentOS7.5 + docker ee 2.配置阿里云yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirro ...
- MR的shuffle和Spark的shuffle之间的区别
mr的shuffle mapShuffle 数据存到hdfs中是以块进行存储的,每一个块对应一个分片,maptask就是从分片中获取数据的 在某个节点上启动了map Task,map Task读取是通 ...
- PAT Sum of Number Segments[数学问题][一般]
1104 Sum of Number Segments(20 分) Given a sequence of positive numbers, a segment is defined to be a ...
- 临时表单导出Excel
function ExportExcel(url, vals) { var form = jQuery("<form action='" + url + "' me ...
- flask应用中取得config的配置
from flask import current_app config = current_app.config SITE_DOMAIN = config.get('SITE_DOMAIN')
- 20145325张梓靖 《Java程序设计》第5周学习总结
20145325张梓靖 <Java程序设计>第5周学习总结 教材学习内容总结 try catch Java中所有错误都会被打包为对象.如果某个方法声明会抛出Throwable或子类实例,只 ...