2011年11月8日

poj3714 最近点对

摘要: 最近点对,采用分治方法。过程:1对原数组依据x左标从小到大排序。2二分数组,左边求出最小值,右边求出最小值,我们求最小的。3找出对于左右两边的可能小于当前最小值的最近点对,更新最小值。这题目需要区分一下点,让我们求的是闪兵到任意一个核电站的最短距离,加一个标志就可以了。代码:#include <iostream>#include <stdio.h>#include <iomanip>#include <algorithm>#include <cmath>using namespace std;const int N=200000+1; 阅读全文

posted @ 2011-11-08 16:42 buptLizer 阅读(2943) 评论(0) 推荐(0) 编辑

poj2079 求最大的三角形面积

摘要: 这个题说给出一堆点,求最大的三角形面积。我们知道这三个点肯定在凸包上,我们求出凸包之后不能枚举,因为题目n比较大,枚举的话要O(n^3)的数量级,所以采用旋转卡壳的做法:首先确定i,j,对k进行循环,知道找到第一个k使得cross(i,j,k)>cross(i,j,k+1),如果k==i进入下一次循环。对j,k进行旋转,每次循环之前更新最大值,然后固定一个j,同样找到一个k使得cross(i,j,k)>cross(i,j,k+1)。对j进行++操作,继续进行下一次,知道j==k为止。关键代码:void rotating_calipers(){ double ans=0.0,are; 阅读全文

posted @ 2011-11-08 16:41 buptLizer 阅读(676) 评论(0) 推荐(0) 编辑

poj2187 最远点对问题

摘要: 这个题用旋转卡壳做的,对于问题规模比较大时就可以体现出来他的优势了。凸包上的点依次与对应边产生的距离成单峰函数,我们首先固定一条边,然后找到第一个k,使得(i,j,k)的叉积<(i,j,k+1)的叉积,这时更新最大值,然后枚举下一个边,这个复杂度是O(n)的,因为我们逆时针枚举边的时候,k也是逆时针变化的。关键代码:void rotating_calipers(){ int ans=0,d1,d2; int i,k; s[top+1]=s[0]; k=1; for(i=0;i<=top;++i) { while(cros(s[i],s[i+1],s[k])<cros(s[i] 阅读全文

posted @ 2011-11-08 16:40 buptLizer 阅读(570) 评论(0) 推荐(0) 编辑

poj1696 Space Ant

摘要: 题目让找出一条最长的非右拐的路径。每次找到一个基准点p0,最开始的时候是最左下角的点,然后我们再从未访问的点中找到相对于p0最小极角的那个点,比较极角用叉积来计算,所以我们总是每次迭代总是用此次循环中找到的最小极角来代替p0,然后再以这个新的p0,找到剩下的点中的最小极角,这样我们找到的就是一条最大的不右转的路径了。代码:#include <iostream>#include <stdio.h>using namespace std;const int N=50;const int INF=10000;struct node{ int id,x,y; node oper 阅读全文

posted @ 2011-11-08 16:38 buptLizer 阅读(554) 评论(0) 推荐(0) 编辑

凸包

摘要: 凸包模板:struct Point{ int x,y; Point operator =(const Point & p) { x=p.x; y=p.y; return *this; }};Point m[N+2],s[N+2];int cro(Point p0,Point p1,Point p2){ return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);}double dis(Point p1,Point p2){ return sqrt(double((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p 阅读全文

posted @ 2011-11-08 16:35 buptLizer 阅读(191) 评论(0) 推荐(0) 编辑

导航