HDU - 3694 Fermat Point in Quadrangle(三分套三分/凸包)
题目链接:点击查看
题目大意:给出四个点,求出该四边形的费马点,费马点是求得一个点,到这四个点的距离最小,最后输出距离,
题目分析:三分套三分,外层三分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(三分套三分/凸包)相关推荐
- HDU - 5017 Ellipsoid(三分套三分/模拟退火)
题目链接:点击查看 题目大意:给出一个椭球面的方程,求椭球面上的点与原点距离的最小值 题目分析:因为涉及到了求最小值,我们可以考虑三分,又因为每一个点都是三维的(x,y,z),不过z可以通过x和y的计 ...
- 三分的多种写法及对应的精度 三分套三分原理
https://www.luogu.org/problemnew/show/P3382 正规三分法 study from: https://blog.csdn.net/pi9nc/article/de ...
- 上海理工大学第二届“联想杯”全国程序设计邀请赛 - Experiment Class(几何+三分套三分)
题目链接:点击查看 题目大意:在二维平面的第一象限中给出两条射线代表河流,再给出起点和终点,问从起点出发,至少经过两条河各一次后到达终点的最短路 题目分析:如果只有一条河的话就是初中数学的经典问题了, ...
- #10017 「一本通 1.2 练习 4」传送带+三分套三分
题目描述 原题来自:SCOI 2010 在一个 2 维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段 AB和线段CD .lxhgww 在 AB上的移动速度为 P ,在 ...
- 传送带(三分套三分)
这个毒瘤题 原题链接 题目描述 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的 ...
- 外卖(food) 洛谷4040宅男计划 三分套二分贪心
food评测传送门 [题目描述] 叫外卖是一个技术活,宅男宅女们一直面对着一个很大的矛盾,如何以有限的金钱在宿舍宅得尽量久. 外卖店一共有 N 种食物,每种食物有固定的价钱 Pi 与保质期 S ...
- hdu 6149 Valley Numer II(01背包套状压dp)
题目链接:hdu 6149 Valley Numer II 题意: 给你N个点,有k个为高点,其他为低点,现在这N个点有m条边,问你最多能组成多少个两个高点一个低点,低点和两个高点都有边相连这样的状态 ...
- 【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 ...
- HDU 3400 Line belt (三分)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3400 题意:给定两条线段AB,CD,在这两条线段上速度分别为P,Q,在其他地方速度为R,让求A 到 D ...
最新文章
- spring boot logback_SpringBoot集成logback后访问日志端点
- 训练损失越来越大_无需contrastive学习,微软亚研提基于实例分类无监督预训练方法...
- Magic Powder - 2
- [CF475E]Strongly Connected City 2
- excel 图片转url_最全总结 | 聊聊 Python 办公自动化之 Excel(下)
- 用python计算准确率_Python 学习 scikit-learn 预测准确率计算
- 电商新春农历年春节海报还没设计?这是你需要的新年Banner灵感!
- xml文件中““符号报错,无法识别
- 华为P40或将搭载鸿蒙,华为P40或将在明年3月发布,很有可能是首部搭载鸿蒙的手机...
- 团队行为守则—如果你们由我来领导
- C#控制网页并自动输入
- eclipse 中 project facet 的作用
- AD制作gerber文件详细步骤
- 串口和TCP调试助手
- <EDEM CFD案例01>EDEM2018 + FLUENT19.2 Coupling Interface Compiling
- springboot jpa链接数据库
- pandas取出符合条件的某单元格的值
- RK3568平台开发系列讲解(安卓适配篇)Android11 预安装应用功能
- A - Heavy Transportation POJ - 1797
- 《RabbitMQ实战指南》读书笔记