首页 > 代码库 > HDU 4445 几何枚举

HDU 4445 几何枚举

给出两个坦克位置,N个炮弹,从(0,h)点以一定角度射出,问在某一角度下能够打到第一个坦克的炮弹最多个数,要求在该角度下所有炮弹都不会打到第二个坦克。


可以暴力水过,枚举角度判断即可

需要几个几何公式化简:

x=v*sinθ*t

v*cosθ*t+g*t*t/2=h  

注意sin 和 cos 函数用多会超时



#include "stdio.h"
#include "string.h"
#include "math.h"

double pi=acos(-1.0);

int main()
{
    int n,j,sum,ok,sb,ans;
    double a,H,h,l1,r1,l2,r2,key,b,c,t,x,i,t1,t2,vx,vy;
    double v[210];

    while (scanf("%d",&n)!=EOF)
    {
        if (n==0) break;
        scanf("%lf%lf%lf%lf%lf",&H,&l1,&r1,&l2,&r2);
        for (j=1; j<=n; j++)
            scanf("%lf",&v[j]);

        if (l2<=l1 && r2>=r1)
        {
            printf("0\n");
            continue;
        }
        ans=0;
        sum=0;
        for (i=0; i<3.1415926; i+=0.0007)
        {

            sum=0;
            ok=1;
            for (j=1;j<=n;j++)
            {
                 a=4.9;
             
                 b=-v[j]*cos(i);
                 c=-H;
                 t=(-b+sqrt(b*b-4*a*c))/9.8;
                 x=sin(i)*v[j]*t;
                 if (x>=l2 && x<=r2 )
                 {
                     ok=0; break;
                 }
                 if (x>=l1 && x<=r1 )
                    sum++;
            }
            if (ok==1 && sum>=ans)
                ans=sum;
           // if (ans==n) break;
        }


        printf("%d\n",ans);
    }
    return 0;
}


HDU 4445 几何枚举