这个题说给出一堆点,求最大的三角形面积。
我们知道这三个点肯定在凸包上,我们求出凸包之后不能枚举,因为题目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; }