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;
}
浙公网安备 33010602011771号