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) 编辑
摘要: POJ_3348 先将凸包找到,然后再用叉积算出多边形的面积之后除以50就是结果。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 10010struct point{ int x, y;}p[MAXD], res[MAXD];int N, P;int cmp(const void *_p, const void *_q){ point *p = (point *)_p, *q = (point *)_q; if(p->y == q->y) return p-> 阅读全文
posted @ 2012-02-17 17:00 Staginner 阅读(376) 评论(0) 推荐(0) 编辑
摘要: POJ_2007 这个题目本质上还是求凸包,然后按题目指定顺序输出各个点即可。#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#define MAXD 60#define zero 1e-8struct point{ int x, y;}p[MAXD], res[MAXD];int N, P;int cmp(const void *_p, const void *_q){ point *p = (point *)_p, *q = (point *)_q; i 阅读全文
posted @ 2012-02-17 16:24 Staginner 阅读(334) 评论(0) 推荐(0) 编辑
摘要: HDU_1392 这个题目比较疑惑的一点就是当N==2时,只要输出两点间距离即可,而不是输出距离的两倍。 至于为什么求凸包的周长就可以,我们不妨用反证法去证明:凸包上点绳子必然要经过的,同时我们找不到一种更优的结果使得绳子的某一部分不是在凸包的边长上。因而我们只要求得凸包并计算其周长即可。 这个算是我学习graham凸包算法之后的处女作了。#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#define MAXD 110#define zero 1e-8str 阅读全文
posted @ 2012-02-17 15:17 Staginner 阅读(432) 评论(0) 推荐(0) 编辑