计算几何
文章平均质量分 74
韩小侠
这个作者很懒,什么都没留下…
展开
-
HDU 4631 set维护
题意:给出n有n个点,每次插入计算最小点对距离,然后把距离和求出来。用multiset按x坐标大小维护就行了。14s #include #include#include#include#includeusing namespace std;struct point{ long long x,y; bool operator < (const point &m)原创 2013-08-02 10:53:43 · 734 阅读 · 0 评论 -
ZOJ 2107 HDU 1007 最近点对
题意:给出100000以内个点,求出最近一对点的距离,然后除以2输出。点数较多不能枚举,运用分治思想,先按照x排序,选出与当前点距离小于当前最优值的,再y排序更新最优值。按照这个思想写完3400ms,上网找了个优化到400+ms的。#include #include#include#include#includeusing namespace std;#define maxn原创 2013-07-22 19:27:43 · 839 阅读 · 0 评论 -
POJ 2354 求球面两点距离
题意:给出球面上两点经纬度,计算球面两点距离。输入输出比较恶心。公式题 直接上公式就能A。#include #include #include using namespace std; double a1,b1,a2,b2,d,r=6875/2.0; char s[99]; double Dis3D(double a1,double b1,double a2,dou原创 2013-07-22 15:46:17 · 912 阅读 · 0 评论 -
POJ 3407 求球面距离
题意:给出球面上两点的经纬度,注意分跟秒进制是60进制的,让求球面上的两点距离。有公式 r*acos(sin(a1)*sin(a2)+cos(a1)*cos(a2)*cos(b1-b2)) 。#include #include#include#include#includeusing namespace std;double Dis3D(double a1,double b1原创 2013-07-22 15:41:40 · 972 阅读 · 0 评论 -
POJ 1673 三角形垂心
题意:给出步骤连接终点与三角形的顶点,求交点o。如图, 以△ABC的边AB、AC、BC向外作正方形ABHI、ACED以及BCFG。连接DI、HG、EF并取它们的中点J、L、K。连接JA、LB、KC并延长。证明:JA、LB、KC的延长线交于一点M,且M点为△ABC的垂心。证明:如图所示,延长AJ与N点,使得NJ=AJ,连接IN。延长JA、LB、KC分别交BC、AC、AB于O、P、Q点原创 2013-07-21 17:47:15 · 1425 阅读 · 0 评论 -
HDU 4353 枚举
题意:给出n个点,为商人要购买的点,m个点为金矿的位置。问如何使够买三个点或三个以上的点围成的多边形面积与多边形内金矿的数量的比值最小。这题很容易想到比值最小的肯定是三角形和在三角形内的点的数量想比。虽然我没想到。然后很容易想到四重循环来找最小的比值但是会超时,所以需要预处理一下,先把两组点按照x轴排序,枚举两个n点,针对于每组点组成的线段选线段正上方的m点,存入数组中。然后再进行n^3循环枚原创 2013-07-20 10:31:28 · 921 阅读 · 0 评论 -
POJ 1375 过一点求圆切线极角
题意:给出一点,几个圆的圆心半径,问两条切线与x轴相交组成的区间,然后合并一下。这题我用解析做,精度损失的太高wa,然后又用极角做,还是精度问题,不过好把数的值扩大一些加上了eps之后过了。具体看代码。#include #include#include#include#includeusing namespace std;struct seg{ double l,原创 2013-06-19 15:21:07 · 1127 阅读 · 0 评论 -
HDU 4316 凸包+半面相交
题意:一个房间,在房间顶部有三个摄像头,房间有放有一个凸多面体的机器,问这个机器对摄像头在地面造成盲点的面积。房间顶部z=100,地面z=0。首先根据空间直线方程(x-x1)/(x1-x2)=(y-y1)/(y1-y2)=(z-z1)/(z1-z2) 求出每个摄像头与凸多面体连线与地面(z=0)的交点。在对这个摄像头在地面的交点求凸包,这个区域就个该摄像头盲区的面积,但是需要求三个盲区面积的交原创 2013-06-04 19:27:28 · 891 阅读 · 0 评论 -
POJ 2420 模拟退火求费马点
题意求一个多边形的费马点,即到所有顶点距离和最小的那一点。以前觉得模拟退火好高端的样子,实际就是把点往四个方向移动固定步长,知道不能移动后缩小步长继续移动,也就是随机求一个接近最优并且满足精度的解。#include #include#include#include#includeusing namespace std;typedef double diy;struct poi原创 2013-06-04 10:36:49 · 1297 阅读 · 0 评论 -
POJ 1434 二分
题意:给出离地高度b,和水箱的长宽高,给出水的容积,问装完水有多高。二分高度,裸二分。#include #include#include#includeusing namespace std;struct cistern{ double b,h,w,d;} data[50005];int n,t;double getans(double h){ doub原创 2013-06-03 16:53:18 · 873 阅读 · 0 评论 -
POJ 2002 hash+枚举
题意:给出n个点,问组成了多少个正方形。枚举两个点,求出另两个点然后hash看是否存在。不会hash,基本上是搬了黄大神的代码= =吗。#include #include#include#includeusing namespace std;const int mm=1005;const int mod=100007;struct point{ int x,y;}原创 2013-06-03 15:22:45 · 671 阅读 · 0 评论 -
POJ 3565 调整思想
题意:给出几个蚁群 ,蚂蚁的食物是苹果树,要求每个蚁群去苹果树的路径是线段并且任意两条路径不能相交,给出蚁群坐标、苹果树坐标,求出任意一组解决方案。这题就不断的调整,如果当前的两条线段相交的话就交换两个点的位置,知道没有相交的线段。#include #include#include#includeusing namespace std;struct point{ int原创 2013-05-29 16:28:41 · 793 阅读 · 0 评论 -
HDU 1756 判断点在多边形内外
题意:判断点在多边形内外,用来试模版的#include #include #include typedef double DIY;const DIY EPS = 0;const DIY N = 1000005;using namespace std;struct Point{ DIY x,y;};struct Segment{ Point a;原创 2013-05-14 19:02:30 · 693 阅读 · 0 评论 -
HDU 4617 立体几何-空间直线距离
题意:给出空间里n个圆的圆心,以及圆周上的两个点,(其实是个光柱的一个截面),问这个光柱的截面原有的圆柱间最近的距离。其实也就是问经过圆心o点方向向量为这个圆面的法向量的直线的距离减去两个圆的半径的最小值。#include #include#include#include#includeusing namespace std;const double eps=1e-8;int s原创 2013-07-26 13:37:16 · 1421 阅读 · 0 评论 -
POJ 2069 最小球覆盖模拟退火
题意:在三维空间内给出一些行星的坐标,求出把所有点都包含在内的球的最小半径。这题要用模拟退火,一开始想到了,没想出来怎么把步长跟确定球心坐标联系在一起,后来才发现求出球心到各点最长的距离然后把球心往最远点移动一段距离就可以了。球心自己选的任意点。。。#include #include#include#include#includeusing namespace std;cons原创 2013-07-26 15:03:12 · 2041 阅读 · 0 评论 -
POJ 3714 最近点对
题意:给出两个点的集合,求属于不同集合的最近点对。这题是最近点对的变形,在求两点距离的时候加以判断是否来自不同集合就行。#include #include#include#include#includeusing namespace std;#define maxn 200005struct point{ double x,y; int f;} p[max原创 2013-07-26 17:23:52 · 835 阅读 · 0 评论 -
HDU 4341 判断共线+背包
题意:黄金矿工的意思,每个点有价值和时间,如果共线得从最近的开始取,问求时间t內取到的最大价值。这题把共线的情况看成一组,要取某个点的话必须把跟这个点共线并且与原点距离在这个点之前的点取到。所以把每条线上的分组用分组背包就可以了。#include #include#include#include#includeusing namespace std;struct point{原创 2013-06-26 09:58:57 · 1093 阅读 · 0 评论 -
HDU 1115 求多边形重心
一个均匀的多边形重心为 横纵坐标和分别除以六倍的面积。#include #include#include#include#include#include#includeusing namespace std;struct point{ double x,y; void input() { scanf("%lf%lf",&x,&y);原创 2013-10-07 20:09:48 · 679 阅读 · 0 评论 -
已知三角形的三条中线长度求面积
题意:给出三角形的三条中线长度求面积。#include #include#include#include#includeusing namespace std;int main(){ double n,m,p; while(cin>>n>>m>>p) { if((m+n+p)*(m+p-n)*(m+n-p)*(n+p-m)<=原创 2013-09-22 13:52:51 · 5765 阅读 · 0 评论 -
HDU 4741 空间几何求两直线距离最近点
给出两直线经过的两点,没有平行的情况,求两直线最短距离和最短距离的两点。#include #include #include #include using namespace std;const double eps = 1e-8;//三维空间点struct Point{ double x, y, z; Point(double x=0,double y原创 2013-09-21 10:21:48 · 1073 阅读 · 0 评论 -
URAL 1043 三角形外接圆
题意:给出一个圆弧上的三个点,求出一个边平行于坐标轴面积最小的矩形并且这个矩形可以给这个圆弧覆盖掉,求矩形面积。步骤:1.先求出给出三点围城三角形的外接圆,圆弧就是这个圆的一部分。2.找出外接圆的上下左右四个端点。3.枚举四个端点如果在弦ab 跟c同侧那么圆弧肯定过这一点,记下这点的极值。用叉积判断同号即可。4.特判端点大于1000的情况然后输出面积即可。这题精度好难调。求原创 2013-09-27 20:48:27 · 913 阅读 · 0 评论 -
SPOJ 3931 求最大面积三角形
题意:给出N个点,范围小于5W,求出其中三个点围成的最大面积。先求出凸包,可以发现最大面积三角形的顶点必然在凸包上。。然后枚举凸包上的每条边,用旋转卡壳来找出距离当前边最远的点,此时更新最大面积即可。#include #include#include#include#includeusing namespace std;#define maxn 50500struct poi原创 2013-09-05 16:52:43 · 1019 阅读 · 0 评论 -
HDU 3662 三维凸包表面多边形个数
题意:求三维凸包表面多边形个数。我是来试模板的= =#include#include#include#include#includeusing namespace std;const int MAXN=1050;const double eps=1e-8;struct Point{ double x,y,z; Point() {} Point(d原创 2013-09-10 18:58:35 · 835 阅读 · 0 评论 -
POJ 3528 & POJ 2974 三维凸包
题意:给出n个点,求三维凸包及其表面积。下面这个模板从NOI选手的资料中拿到的,特别短,用的是卷包裹法,不过貌似必须保证四点不共面,要不就会出错。#include #include#include#include#include#include#include#include#define maxn 1000using namespace std;struct po原创 2013-09-10 17:52:37 · 765 阅读 · 0 评论 -
HDU 2438 求函数+三分
题意:给出x,y,l,d,问汽车能否拐过去。只需要求汽车下沿抵住下面墙壁时汽车初始左下角点P横坐标最大值就行。f(θ)=l*cos(θ)-(x*cos(θ)-d)/sin(θ).f(θ)在区间(0,π/2)上先增后减,三分最大值即可#include #include#include#include#includeusing namespace std;doubl原创 2013-08-16 13:47:35 · 1014 阅读 · 0 评论 -
HDU 4667 精度+凸包+圆切线
题意:给出n个圆 m个三角形求一个最短距离把平面上的这两种图形包围住。基本思想就是求出所有的“关键点”。将两圆两两求外切线,得到所有切点;将圆和三角形的三个点依次做切线,也得到切点;加上所有三角形的三个点。对这些点用Graham 求凸包,对于凸包上的每条边,如果它们在同一个圆上,用等价的圆弧替代即可。这题重要的不是思路而是精度。eps要再求凸包时起到明显作用,不然求原创 2013-08-15 15:48:57 · 1309 阅读 · 0 评论 -
HDU 4386 给出四条边长求最大面积
题意:给出四条边长求四条边长最大面积。不难发现凸四边形的面积最大,并且该四边形的端点在一个圆上,如果a+b+c#include #include#include#include#includeusing namespace std;int main(){ double a[4]; int ca=0,t; scanf("%d",&t); whi原创 2013-07-28 19:41:51 · 1012 阅读 · 0 评论 -
HDU 4380 预处理枚举
题意:给出n个房子m个矿问从n个房子选三个组成的三角形内部矿数为奇数有多少种选法。先预处理一下每条线段正上方有多少个点,然后在枚举三条线段就可以了。#include #include#include#include#includeusing namespace std;struct point{ long long x,y;};int cmp(point a,po原创 2013-07-28 19:33:53 · 990 阅读 · 0 评论 -
POJ 2187 凸包+旋转卡壳
题意:求凸包最长点对,输出两点距离的平方。先求凸包,再旋转卡壳求直径关于旋转卡壳的具体实现 http://www.cppblog.com/staryjy/archive/2009/11/19/101412.html#include #include#include#include#includeusing namespace std;typedef int原创 2013-03-29 11:11:31 · 807 阅读 · 0 评论 -
POJ 2451 求半面交
题意:求半面想交后的面积,题目数据较大,使用o(n*logn)算法。这题WA两次忘了m#include#include#include#includeusing namespace std;const int mm=20005;typedef double DIY;struct point{ DIY x,y; point() {} point(DIY原创 2013-04-19 11:16:41 · 682 阅读 · 0 评论 -
POJ 3304 判断直线与线段相交
题意:问存不存在一条直线,各个线段在直线上的投影有公共部分,也就是判断是否存在一条直线将所有线段都相交。枚举所有端点构成的直线如果有一条直线相交所有线段那么就存在。#include #include#include#include#includeusing namespace std;#define eps 1e-8typedef double PointType;stru原创 2013-03-04 11:30:30 · 499 阅读 · 0 评论 -
POJ 2318 判定点在多边形内外(二分)
题意:图片是一个俯视图,按照从左到右的顺序输入边 然后输入点坐标,问从左到右的各个区域分别有多少玩具。已知顺序只需要二分来确定区间,然后得出结果。#include #include#include#includeusing namespace std;struct point{ double x,y;};struct edge{ point up,down原创 2013-03-01 15:59:07 · 562 阅读 · 0 评论 -
POJ 2398 判断点在多边形内外
题意:给出一个矩形,再给出n条两端点分别在上下边的线段,然后给出m个点,要求按每个区域内的点数的升序输出点数t,后面为区域内有t的区域数。这题按照题意做注意要对矩形内的边排序然后再二分判断点在那个区域里。#include #include#include#includeusing namespace std;struct point{ double x,y;};st原创 2013-03-01 14:54:20 · 577 阅读 · 0 评论 -
POJ 1410 判断线段相交点在多边形内外
题意:判断一线段与矩形是否相交。需要注意的是输入可能不是按照左上右下的顺序,如果线段两个端点都在举行内的话也算相交。这题分为判断线段与4边是否有交点,如果没有判断两点是否在矩形内就可以了。我用的方法是射线法。#include #include#include#includeusing namespace std;typedef double PointType;struct p原创 2013-03-01 11:07:53 · 772 阅读 · 0 评论 -
POJ 1269 求两直线交点
题意:给出4个点,两个一组在两条直线上,求出这两条直线的重合部分,NONE就是平行,LINE就是重合,POINT就是有交点并且输出交点。解析几何那么求,没什么好说的直接看代码吧。#include #include#includeusing namespace std;typedef double PointType;struct point{ PointType x,y原创 2013-02-28 20:44:10 · 544 阅读 · 0 评论 -
POJ 2007 极角排序
题意:给出一个凸包的顶点,以第一次输入进去的点按逆时针方向排序。看到有人说是凸包题,题意已经明确是凸包的顶点所以没有必要再用Graham模板。利用叉积的性质对极角进行排序就可以。#include #include#includeusing namespace std;struct point{ int x,y;};int Direction(point a,point原创 2013-02-28 16:15:12 · 558 阅读 · 0 评论 -
POJ 1106 极角排序
题意给出一些点片段圆心为t半径为r的半圆最大能覆盖多少个点。首先在输入的时候把距离大于半径的点筛出去。剩余点通过极角排序然后枚举半圆的一条边通过该点能覆盖的点数取最大值就可以了。#include #include#includeusing namespace std;struct point{ int x,y;};int Direction(point a,point原创 2013-02-28 10:53:50 · 536 阅读 · 0 评论 -
POJ 1329 求三角形外接圆
题意给出三角形三点坐标让求出该三角形的外接圆标准方程和一般方程。这题输出很恶心,注意0.000的时候要输出并且前面的符号为“ + ”,那么外接圆的半径r通过S=(a*b*c)/(4*r)可以求出r=(a*b*c)/(4*S),然后外心坐标是三边垂直平分线的交点,求出两个垂直平分线方程然后可以得出交点坐标。#include #include#include#include#inclu原创 2013-02-28 08:47:26 · 1086 阅读 · 0 评论 -
POJ 1066 判断线段相交
题意:有个考古队进金字塔里盗墓,大小100*100,样图是一个俯视图,给了财宝坐标,又给了各个墙。题目规定考古队在每面墙的中点处开一个洞,这样就避免了两墙交点的情况,求最小的凿墙数目。很明显,枚举连接四面两个墙之间中点与宝藏的线段,求出这种线段与墓里墙相交的最小值。其实可以不用枚举中点,直接用墙的端点与宝藏相连的线段就行,细想一想可以想明白。#include #include#incl原创 2013-02-28 19:34:51 · 571 阅读 · 0 评论 -
POJ 1113 二维凸包
题意:国王把自己城堡看成了一个点,让你找一个凸包把所有的城堡包住并且这个凸包距离城堡最近不能小于L,求这个凸包的最短长度。题意就是求凸包最短长度再加上以L为半径的圆的周长就有解了。是一道使用Graham扫描法的模板题。一开始我用STL里的stack建栈,c++超时,g++985ms,而且感觉不是那么方便。之后我又用数组建栈写了,果断0ms,并且代码也没有那么长。这个数组建栈的#incl原创 2013-02-27 14:38:49 · 451 阅读 · 0 评论