• 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
  • 相关阅读:
    POJ 2031 Building a Space Station 最小生成树模板
    POJ 2492 A Bug's Life 并查集
    HDU 2255 奔小康赚大钱 KM算法的简单解释
    HDU 2802 F(N) 数论+打表
    HDU 5455 Fang Fang 水题,但题意描述有问题
    LightOJ 1341 Aladdin and the Flying Carpet 算数基本定理
    LightOJ 1370 Bi-shoe and Phi-shoe 数论
    HDU 5652 India and China Origins 二分优化+BFS剪枝
    bzoj2287【POJ Challenge】消失之物(退背包)
    bzoj3297[USACO2011 Open]forgot(dp + string)
  • 原文地址:https://www.cnblogs.com/ACMERY/p/4483405.html
Copyright © 2020-2023  润新知