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;
	int i,j,k,kk;
	k=1;
	++top;//top是凸包上顶点的个数
	for(i=0;i<top;++i)
	{
		j=(i+1)%top;
		k=(j+1)%top;
		while(k!=i && cros(s[i],s[j],s[k])<cros(s[i],s[j],s[k+1]))
			k=(k+1)%top;
		if(k == i)
			continue;
		kk=(k+1)%top;
		while(j!=kk && k!=i)
		{
			are=getArea(s[i],s[j],s[k]);
			if(are>ans)
				ans=are;
			while(k!=i && cros(s[i],s[j],s[k])<cros(s[i],s[j],s[k+1]))
				k=(k+1)%top;
			j=(j+1)%top;
		}
	}
	cout<<setiosflags(ios::fixed)<<setprecision(2)<<ans<<endl;
}

 

posted on 2011-11-08 16:41  buptLizer  阅读(675)  评论(0编辑  收藏  举报

导航