题目链接:点击查看

题目大意:给出四个点,求出该四边形的费马点,费马点是求得一个点,到这四个点的距离最小,最后输出距离,

题目分析:三分套三分,外层三分x,内层三分y即可,不过就是目前来说遇到的所有三分问题都过于玄学,有时候样例过不了却A了,有时候自认为没问题却WA了数十发,这里要改一下以前的书写习惯,以前总喜欢这样写:

double mid=(l+r)/2;

double mmid=(mid+r)/2;

到目前为止,已经因为这样写WA了两个题目了,需要改成这样写才能A:

double mid=l+(r-l)/3;

double mmid=r-(r-l)/3;

嘛。。背过就好了三分就要有三分的样子,就不要整二分+二分勉强凑三分的那样写了,这个题目也算裸题了,一个玄学裸题,好像也可以用费马点的方法来求,我在vj上挂的题已经T了四发了,感觉三分也不是那么靠谱。。等学完了费马点再把新的代码挂上:

还有注意一下这个题的eps要设成1e-7,多了会T少了会WA

三分套三分:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#define Pi acos(-1.0)
using namespace std;typedef long long LL;const LL inf=0x3f3f3f3f3f3f3f3f;const int N=50;const double eps=1e-7;struct Pos
{double x,y;
}node[5];double dis(double x,double y)
{double ans=0;for(int i=0;i<4;i++)ans+=sqrt((node[i].x-x)*(node[i].x-x)+(node[i].y-y)*(node[i].y-y));return ans;
}double check(double x)
{double l,r=1000;double ans;while(fabs(l-r)>eps){double mid=l+(r-l)/3;double mmid=r-(r-l)/3;double ans1=dis(x,mid);double ans2=dis(x,mmid);if(ans1>ans2){l=mid;ans=ans2;}else{r=mmid;ans=ans1;}}return ans;
}int main()
{
//  freopen("input.txt","r",stdin);while(1){for(int i=0;i<4;i++)scanf("%lf%lf",&node[i].x,&node[i].y);if(node[0].x<0)break;double l=0,r=1000;double ans;while(fabs(l-r)>eps){double mid=l+(r-l)/3;double mmid=r-(r-l)/3;double ans1=check(mid);double ans2=check(mmid);if(ans1>ans2){l=mid;ans=ans2;}else{r=mmid;ans=ans1;}}printf("%.4f\n",ans);}return 0;
}

好了我又回来了,学了一波凸包,大概会用板子了,把poj的那个数据比较强的也A掉了

先来说一下费马点的结论:

若四边形为凸边形,则费马点为对角线交点

若四边形为凹边形,则费马点为四边形的其中一个顶点

有了这个结论就好办了,我们可以先用Graham算法判断一下该四边形是否为凸边形,若是的话求出对角线距离,不是的话枚举每一个点到其他三个点的距离,取最小即可

直接求费马点:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#define Pi acos(-1.0)
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=10;int n=4,tot;struct node
{double x,y;
}a[N],p[N];double dis(node A,node B)              //距离
{return sqrt((B.x-A.x)*(B.x-A.x)+(B.y-A.y)*(B.y-A.y));
}double x(node A,node B,node C)         //叉积公式
{return (B.x-A.x)*(C.y-A.y)-(C.x-A.x)*(B.y-A.y);
}bool cmp(node A,node B)                //极角排序
{double pp=x(A,B,a[0]);if(pp>0)return true;if(pp<0) return false;return  dis(a[0],A)<dis(a[0],B);
}int Graham()                          //Graham算法
{int k=0;for(int i=1;i<n;i++)if(a[i].y<a[k].y||(a[i].y==a[k].y&&a[i].x<a[k].x))k=i;swap(a[0],a[k]);sort(a+1,a+n,cmp);tot=2;p[0]=a[0],p[1]=a[1];for(int i=2;i<n;i++){while(tot>0&&x(p[tot-2],p[tot-1],a[i])<=0) tot--;  //不带共线的!p[tot++]=a[i];}return tot;
}int main()
{
//  freopen("input.txt","r",stdin);while(1){for(int i=0;i<4;i++)scanf("%lf%lf",&a[i].x,&a[i].y);if(a[0].x<0)break;double ans;if(Graham()==4){ans=dis(p[0],p[2])+dis(p[1],p[3]);}else{ans=1e18;for(int i=0;i<4;i++){double temp=0;for(int j=0;j<4;j++)if(i==j)continue;elsetemp+=dis(a[i],a[j]);ans=min(ans,temp);}}printf("%.4f\n",ans);}return 0;
}

HDU - 3694 Fermat Point in Quadrangle(三分套三分/凸包)相关推荐

  1. HDU - 5017 Ellipsoid(三分套三分/模拟退火)

    题目链接:点击查看 题目大意:给出一个椭球面的方程,求椭球面上的点与原点距离的最小值 题目分析:因为涉及到了求最小值,我们可以考虑三分,又因为每一个点都是三维的(x,y,z),不过z可以通过x和y的计 ...

  2. 三分的多种写法及对应的精度 三分套三分原理

    https://www.luogu.org/problemnew/show/P3382 正规三分法 study from: https://blog.csdn.net/pi9nc/article/de ...

  3. 上海理工大学第二届“联想杯”全国程序设计邀请赛 - Experiment Class(几何+三分套三分)

    题目链接:点击查看 题目大意:在二维平面的第一象限中给出两条射线代表河流,再给出起点和终点,问从起点出发,至少经过两条河各一次后到达终点的最短路 题目分析:如果只有一条河的话就是初中数学的经典问题了, ...

  4. #10017 「一本通 1.2 练习 4」传送带+三分套三分

    题目描述 原题来自:SCOI 2010 在一个 2 维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段  AB和线段CD .lxhgww 在  AB上的移动速度为 P ,在  ...

  5. 传送带(三分套三分)

    这个毒瘤题 原题链接 题目描述 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的 ...

  6. 外卖(food) 洛谷4040宅男计划 三分套二分贪心

    food评测传送门 [题目描述] 叫外卖是一个技术活,宅男宅女们一直面对着一个很大的矛盾,如何以有限的金钱在宿舍宅得尽量久.     外卖店一共有 N 种食物,每种食物有固定的价钱 Pi 与保质期 S ...

  7. hdu 6149 Valley Numer II(01背包套状压dp)

    题目链接:hdu 6149 Valley Numer II 题意: 给你N个点,有k个为高点,其他为低点,现在这N个点有m条边,问你最多能组成多少个两个高点一个低点,低点和两个高点都有边相连这样的状态 ...

  8. 【HDU - 2899】 Strange fuction(二分或三分,求导)

    题干: Now, here is a fuction:    F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)  Can you fi ...

  9. HDU 3400 Line belt (三分)

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3400 题意:给定两条线段AB,CD,在这两条线段上速度分别为P,Q,在其他地方速度为R,让求A 到 D ...

最新文章

  1. spring boot logback_SpringBoot集成logback后访问日志端点
  2. 训练损失越来越大_无需contrastive学习,微软亚研提基于实例分类无监督预训练方法...
  3. Magic Powder - 2
  4. [CF475E]Strongly Connected City 2
  5. excel 图片转url_最全总结 | 聊聊 Python 办公自动化之 Excel(下)
  6. 用python计算准确率_Python 学习 scikit-learn 预测准确率计算
  7. 电商新春农历年春节海报还没设计?这是你需要的新年Banner灵感!
  8. xml文件中““符号报错,无法识别
  9. 华为P40或将搭载鸿蒙,华为P40或将在明年3月发布,很有可能是首部搭载鸿蒙的手机...
  10. 团队行为守则—如果你们由我来领导
  11. C#控制网页并自动输入
  12. eclipse 中 project facet 的作用
  13. AD制作gerber文件详细步骤
  14. 串口和TCP调试助手
  15. <EDEM CFD案例01>EDEM2018 + FLUENT19.2 Coupling Interface Compiling
  16. springboot jpa链接数据库
  17. pandas取出符合条件的某单元格的值
  18. RK3568平台开发系列讲解(安卓适配篇)Android11 预安装应用功能
  19. A - Heavy Transportation POJ - 1797
  20. 《RabbitMQ实战指南》读书笔记

热门文章

  1. RabbitMQ发布确认原理
  2. MyBatis 源码解读-loadCustomLogImpl(settings)
  3. ClassLoader简介
  4. 微服务发现组件Eureka:简介以及Eureka服务端开发
  5. python怎么运行_程序员大牛讲解,Python程序的执行原理
  6. postman cookie设置_是时候抛弃Postman了,因为REST Client更香
  7. DOM基本操作(二:对节点的操作)
  8. JS实现省市联动效果
  9. redhat6.x_linux学习笔记
  10. 继承的基本概念(1)