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\n",cas,maxx); 76 } 77 return 0; 78 }
人生就像心电图,想要一帆风顺,除非game-over