给题意跪了。。。
题目输入一个凸包上的点(没有凸包内部的点,要么是凸包顶点,要么是凸包边上的点),判断这个凸包是否稳定。所谓稳定就是判断能不能在原有凸包上加点,
得到一个更大的凸包,并且这个凸包包含原有凸包上的所有点。
这样,只需判断每条边是否有大于等于三点即可。注意,一条直线的凸包是NO
#include#include #include #include using namespace std;struct point { int x,y;}p[1050];int n;int stop,cnt;int ans[1050],st[1050];bool cmp(point A,point B){ if(A.y 0;}void slove(){ stop=cnt=0; st[stop++]=0; st[stop++]=1; for(int i=2;i 1&&multi(p[i],p[st[stop-1]],p[st[stop-2]])) stop--; st[stop++]=i; } for(int i=0;i =0;i--){ while(stop>1&&multi(p[i],p[st[stop-1]],p[st[stop-2]])) stop--; st[stop++]=i; } for(int i=1;i =cnt) { printf("NO\n"); continue; } for(int i=0;;i=k-1){ s=p[ans[i]];t=p[ans[++i]]; if(i+1>=cnt){ flag=false; break; } e=p[ans[i+1]]; if((e.x-s.x)*(t.y-s.y)-(e.y-s.y)*(t.x-s.x)!=0){ flag=false; break; } k=i+1; while(true){ e=p[ans[k]]; if((e.x-s.x)*(t.y-s.y)-(e.y-s.y)*(t.x-s.x)!=0){ break; } k++; if(k>=cnt) break; } if(k>=cnt) break; } if(flag) printf("YES\n"); else printf("NO\n"); } return 0;}