上一页 1 ··· 39 40 41 42 43 44 45 46 47 ··· 85 下一页
  2012年2月19日
摘要: POJ_3525 这个题目限制了是一个凸多边形,于是多边形所在的范围就等价于各个边所在的直线划分成的半平面的交,如果是凹多边形的话显然就不能这样等价了。 首先,我们可以把问题转化为求凸多边形的半径最大的内切圆,同时,我们会发现,如果各个边向内收缩r的话,内切圆的半径就会减少r,当缩到半平面交恰好不存在时,内切圆的半径也就为0了,这时向内收缩的距离r自然就是内切圆的最大半径了。 于是我们只要二分内切圆的半径r作为各条边向内收缩的距离,然后判断这时半平面交是否为空集即可,如果为空则说明向内收缩的过头了,于是就要更新max,否则就更新min。 值得一提的是,当半平面交恰好不存在时(或者说恰好存... 阅读全文
posted @ 2012-02-19 19:42 Staginner 阅读(758) 评论(0) 推荐(0) 编辑
摘要: POJ_1474 对于半平面交的一些简明扼要的介绍可以参考这篇博客:http://blog.csdn.net/accry/article/details/6070621。此外,这篇博客上介绍的还有我敲出的程序都只是比较好理解的O(n^2)的求半平面交的算法,对于O(nlogn)的算法可以参考朱泽园的论文。 由于这个题目指明了多边形上的点是按顺时针序给出的,因而就不用再将每组数据都其统一成某个顺序了。 POJ上这个题目INF不宜开太大,开太大比如0x3f3f3f3f会WA,但在ZOJ就没事,计算几何的精度问题太玄妙了,所以只好自己把握尺度啦。#include<stdio.h>#inc 阅读全文
posted @ 2012-02-19 16:16 Staginner 阅读(402) 评论(0) 推荐(0) 编辑
摘要: POJ_3130 对于半平面交的一些简明扼要的介绍可以参考这篇博客:http://blog.csdn.net/accry/article/details/6070621。此外,这篇博客上介绍的还有我敲出的程序都只是比较好理解的O(n^2)的求半平面交的算法,对于O(nlogn)的算法可以参考朱泽园的论文。 由于这个题目指明了多边形上的点是按逆时针序给出的,因而就不用再将每组数据都其统一成某个顺序了。#include<stdio.h>#include<string.h>#define MAXD 110#define zero 1e-8#define INF 100000s 阅读全文
posted @ 2012-02-19 16:12 Staginner 阅读(415) 评论(0) 推荐(0) 编辑
摘要: POJ_3335 这个题目是我写的第一个半平面交的题目,之前总以为半平面交是个很高深的东西,但实际上真正去接触它时才发现它其实也并不复杂,搞ACM的过程中很多时候都是这样,因为自己的畏怯而不敢去接触一类新的算法、题目,算是又跨过了一个小门槛,继续努力啦! 对于半平面交的一些简明扼要的介绍可以参考这篇博客:http://blog.csdn.net/accry/article/details/6070621。此外,这篇博客上介绍的还有我敲出的程序都只是比较好理解的O(n^2)的求半平面交的算法,对于O(nlogn)的算法可以参考朱泽园的论文。#include<stdio.h>#incl 阅读全文
posted @ 2012-02-19 16:09 Staginner 阅读(827) 评论(0) 推荐(0) 编辑
  2012年2月18日
摘要: POJ_1873 由于树木比较少,可以枚举砍树的决策,然后计算砍掉的树木的长度是否比剩下的树木的凸包的周长要长,每次计算之后按题意更新最优解即可。 在枚举的时候还可以应用一个剪枝,就是如果当前砍树损失的价值比记录的最小价值要大的话,就可以直接枚举下一种情况了,而不必再去花时间计算凸包和凸包的周长了,这样可以节省很多时间。#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#define MAXD 20#define zero 1e-8#define INF 0x 阅读全文
posted @ 2012-02-18 22:03 Staginner 阅读(265) 评论(0) 推荐(0) 编辑
摘要: POJ_1228 首先说明几点,第一,这个题目用long long int就可以了,不必像discuss说的那样非要用double不可,long long int如果都超了的话,用double计算出的精度也就值得怀疑了,第二,这个题目应该没有所有点都共线的数据,因为我不加那个判断也可以AC,但根据题意来看,应该还是要判断一下的。 这个题的题意感觉太费解了,后来折腾来折腾去我就直接按别人理解的去做了:判断凸包上的每条边至少包含3个点。 首先显然n<6是不可能的,因为最后需要是一个凸多边形,那么至少有3个顶点,再加上每条边上的1个点,一共是6个点。 之后,一个思路就是把这些点的逆时针序或者顺 阅读全文
posted @ 2012-02-18 17:33 Staginner 阅读(338) 评论(1) 推荐(0) 编辑
  2012年2月17日
摘要: POJ_1673 O实际上是△ABC的垂心,证明如下: 先将△EBJ绕B点逆时针旋转90度,这时EB与AB重合,BJ与BC共线。之所以BJ与BC共线是因为∠ABC和∠EBJ之前是互补的。这时,就会出现一个大的组合而成的三角形△JAC,同时BC=BJ,ME=MJ,所以ME是△JAC的中位线,因此BM平行于AC。而BM是旋转90度之后平行于AC的,于是之前BM就是垂直于AC的了,进而就可以得到O是△ABC的垂心。 这个题目输出的时候需要加一个很小的量(eps)比如1e-8然后再输出,至于为什么这个样子我也搞不懂,看discuss说做计算几何题输出结果的时候最好顺手加个eps,囧。#include& 阅读全文
posted @ 2012-02-17 23:54 Staginner 阅读(439) 评论(0) 推荐(0) 编辑
摘要: POJ_1106 首先,我们可以把圆以外的点去掉。 之后,一开始想到的是枚举直径和x轴的夹角去算,但这样精度不能保证,而且不好算,于是否决掉了。 后来想了一下,这个题目实际可以转化成一个圆里面有一些点,然后用一条直径把圆切成两半,这样哪一半里面的点多就取哪一半。同时不难想到,一定可以构造出这条直径过某个点且切完之后可以得到最优解的情况,因为如果这条直径不过任何一个点,我们就可以将其旋转使其过某一点,同时这样不会影响到解的最优性。 想到这,剩下的工作就比较简单了。我们只要枚举每一个圆内的点,将其与圆心的连线作为切割的直径,然后运用叉积判断剩下的每个点是在这条直径的左边还是右边就能计算出左右两.. 阅读全文
posted @ 2012-02-17 21:47 Staginner 阅读(440) 评论(0) 推荐(0) 编辑
摘要: POJ_2354 这个题目本质就是应用一个求球面上两点间球面距离的公式,这个可以在网上搜到。但这个题输入比较恶心,而且最后和100比较的时候先要把算出来的结果四舍五入到百分位,然后再和100去比较。#include<stdio.h>#include<string.h>#include<math.h>#define zero 1e-8const double R = 6875.0 / 2;const double pi = acos(-1.0);double a1, a2, b1, b2;char b[110], st[10];int dcmp(double 阅读全文
posted @ 2012-02-17 20:07 Staginner 阅读(345) 评论(0) 推荐(0) 编辑
摘要: POJ_1113 我们可以先将问题做一个转化:先求出城堡各点的凸包,然后求距凸包的距离为L的闭合图形的周长。 至于为什么先转化成凸包,我们不妨用反证法,如果围墙向凸包内部的方向延伸的话必然还要延伸出来,这样就会更费料。 围墙的形状不难想象,一部分是和边平行且等于各边的边长的,还有一部分就是墙角位置的弧形,而且这个弧形的圆心角正是两条边的方向向量的夹角。 在计算周长的时候,一部分就是凸包的周长,另一部分就是这些弧的长度之和。我们当然可以求出每个角上的弧,然后累加到一起,但这样会涉及很多的三角函数和开方函数的运算,就会有更多精度上的损失,其实细想一下会发现把这些弧拼起来就是一个完整的圆,因... 阅读全文
posted @ 2012-02-17 18:14 Staginner 阅读(350) 评论(0) 推荐(0) 编辑
上一页 1 ··· 39 40 41 42 43 44 45 46 47 ··· 85 下一页