题目
题目
分析
跟着lrj学的,理解了,然而不是很熟,还是发上来供以后复习
代码
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=1005; 5 6 struct Point 7 { 8 int x,y; 9 double rad; 10 bool operator < (const Point &rhs) const{ 11 return rad<rhs.rad; 12 } 13 }op[maxn],p[maxn]; 14 15 int n,color[maxn]; 16 17 bool left(Point A,Point B) 18 { 19 return A.x*B.y - A.y*B.x >= 0; 20 } 21 22 int solve() 23 { 24 if(n<=2) return 2; 25 int ans=0; 26 27 for(int i=0;i<n;i++) 28 { 29 int k=0; 30 31 //极角排序 32 for(int j=0;j<n;j++) 33 if(j!=i) 34 { 35 p[k].x=op[j].x-op[i].x; 36 p[k].y=op[j].y-op[i].y; 37 if(color[j]) 38 { 39 p[k].x = -p[k].x; p[k].y = -p[k].y; 40 } 41 p[k].rad=atan2(p[k].y , p[k].x); 42 k++; 43 } 44 sort(p,p+k); 45 46 //滑动 47 int L=0 , R=0 , cnt=2; 48 while(L < k) 49 { 50 if(R==L) { R = (R+1)%k; cnt++; } 51 while(R != L && left(p[L] , p[R])) 52 { 53 R = (R+1)%k; cnt++; 54 } 55 cnt--; L++; 56 ans=max(ans,cnt); 57 } 58 } 59 return ans; 60 } 61 62 int main() 63 { 64 while(scanf("%d",&n)==1 && n) 65 { 66 for(int i=0;i<n;i++) 67 scanf("%d%d%d", &op[i].x, &op[i].y, &color[i]); 68 printf("%d\n",solve()); 69 } 70 return 0; 71 }