HDU3952-几何

题意:给n个水果,每个水果包括m个点(即m条边),判断一刀能切的最多的水果数目;

思路:数据比较小,n <= 10,m <= 10;可以暴力枚举,枚举两个水果的任意两个点,连成一条直线,然后枚举其他的水果上的两个点,看该直线是否能切过水果(即判断两条线段是否相交);

当时我们想到了这个方法,但是觉得遇到下图的情况怎么办?于是就否定了这个想法,多往下想一步就好了,不过很多时候都是差这一步,想改过来的话得多锻炼;

这种情况不会发生,因为如果1在2,3中间的话,那么枚举1和2的时候,一定能切到3。

 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 }
View Code
原文地址:https://www.cnblogs.com/ACMERY/p/4483405.html