直线和凸包(HDU3952--Fruit Ninja)

题意:http://acm.hdu.edu.cn/showproblem.php?pid=3952

思路:https://www.cnblogs.com/ACMERY/p/4483405.html

判断直线切凸包就是判断一下存不存在端点在直线异侧就行了。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<stack>
 7 #include<queue>
 8 #include<string>
 9 #include<map>
10 #include<set>
11 #define maxn 11
12 #define INF
13 #define eps 1e-8
14 #define zero(x) (((x)>0?(x):-(x))<eps)
15 #define _sign(x) ((x)>eps?1:((x)<-eps?2:0))
16 using namespace std;
17 #define rep(i,n) for(int i=0;i<n;i++)
18 #define rep1(i,x,y) for(int i=x;i<=y;i++)
19 int T,m;
20 int n[maxn];
21 struct point
22 {
23     double x,y;
24 } p[maxn][11];
25 double xmult(point p1,point p2,point p0)
26 {
27     return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
28 }
29 int opposite(point p1,point p2,point l1,point l2)
30 {
31     return xmult(l1,p1,l2)*xmult(l1,p2,l2)<-eps||fabs(xmult(l1,p1,l2)*xmult(l1,p2,l2))<eps;
32 }
33 int main()
34 {
35     scanf("%d",&T);
36     for(int cas=1; cas<=T; cas++)
37     {
38         scanf("%d",&m);
39         for(int i=0; i<m; i++)
40         {
41             scanf("%d",&n[i]);
42             for(int j=0; j<n[i]; j++)
43             {
44                 scanf("%lf %lf",&p[i][j].x,&p[i][j].y);
45             }
46         }
47         int cnt=0;
48         int maxx=-1;
49         for(int i=0; i<m; i++)
50             for(int j=0; j<n[i]; j++)
51                 for(int k=0; k<m; k++)
52                     for(int q=0; q<n[k]; q++)
53                     {
54                         cnt=0;
55                         for(int w=0; w<m; w++)
56                         {
57                             int flag=0;
58                             for(int u=0; u<n[w]; u++)
59                             {
60                                 for(int v=0; v<n[w]; v++)
61                                 {
62                                     if(opposite(p[w][u],p[w][v],p[i][j],p[k][q]))
63                                     {
64                                         cnt++;
65                                         flag=1;
66                                         break;
67                                     }
68                                 }
69                                 if(flag)
70                                     break;
71                             }
72                         }
73                         maxx=max(maxx,cnt);
74                     }
75         printf("Case %d: %d
",cas,maxx);
76     }
77     return 0;
78 }