pku 2079 最大三角形 (凸包)(目前TLE)

最大三角形的三个顶点必定在凸包上。

求出凸包上的点后,枚举各种组合,得到最大面积。

朴素算法的时间复杂度是(n^3),但可根据凸包的单峰性进行剪枝。

 

固定前两点,然后顺着凸包枚举下一个点,求面积,可以发现面积是单峰性的。所以如果当前面积小于上面积,就直接break;

考虑还可以发现,当固定第一个点,枚举第二个点,依然存在单峰性,因此第二个循环里面也一样可以加上一个break。

#include <iostream> using namespace std; int N,stack_top; struct Node { int x,y; }m_stack[50005],position[50005]; inline int CrossMutiply(Node p1,Node p2,Node p3) { return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x); } inline int Distance(Node p1,Node p2) { return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y); } int CMP(const void* a,const void* b) { Node *p1=(Node*)a,*p2=(Node*)b; int m=CrossMutiply(position[0],*p1,*p2); if(m==0) return Distance(position[0],*p1)-Distance(position[0],*p2); else return -m; } void Convex() { int swap=0; for(int i=1;i<N;i++) { if((position[i].y<position[swap].y)||(position[i].y==position[swap].y&&position[i].x<position[swap].x)) swap=i; } Node temp=position[swap]; position[swap]=position[0]; position[0]=temp; qsort(position+1,N-1,sizeof(position[0]),CMP); m_stack[0]=position[0]; m_stack[1]=position[1]; stack_top=1; for(int i=2;i<N;i++) { while(stack_top>=1&&CrossMutiply(m_stack[stack_top-1],m_stack[stack_top],position[i])<=0) stack_top--; m_stack[++stack_top]=position[i]; } } int main() { int ans,now,last,last2; while(scanf("%d",&N),N!=-1) { for(int i=0;i<N;i++) { scanf("%d%d",&position[i].x,&position[i].y); } Convex(); ans=0; for(int i=0;i<stack_top-1;i++) { last2=-1; for(int j=i+1;j<stack_top;j++) { last=-1; for(int k=j+1;k<=stack_top;k++) { now=CrossMutiply(m_stack[i],m_stack[j],m_stack[k]); if(now<=last) break; last=now; } if(last<=last2) break; last2=last; } if(last2>ans) ans=last2; } printf("%.2f/n",((double)ans)/2); } return 0; }

你可能感兴趣的:(算法,struct,ini,iostream,distance)