HDU 4445 Crazy Tank

来源:互联网 发布:虚拟恋人软件 编辑:程序博客网 时间:2024/06/04 19:52

题目:click here~

给你N个炮弹的发射速度,以及炮台高度H和L1,R1,L2,R2。

问任选发射角度,最多能有几个炮弹在不打入L2~R2的情况下打入L1~R1

注意:区间有可能重叠。

思路:

物理题,发现单纯的根据V去求X非常困难。

这个时候想到暴力枚举角度,for(double i=0; i<=pi; i+=0.0007)

算出能到达的x,然后判断x,统计sum

发现以增长级0.0007弧度 刚刚好能过这道题

#include <iostream>#include <map>#include <cstdio>#include <cstring>#include <vector>#include <algorithm>#include <cmath>using namespace std;#define Pi acos(-1.0)#define eps 1e-9const double inc = 0.0007;vector<double> v;double H,L1,R1,L2,R2,V;int ans;int N;int temp;//double h,x,x_ans;/*bool dfs(double mid,int i){    if(i == N)    {        ans = max(temp,ans);        return true;    }    if(mid>Pi/2)    {        double q = mid - Pi/2;        h = (v[i]*sin(q))*(v[i]*sin(q))/2/9.8;        x = (v[i]*v[i])*sin(2*q)/2/9.8;        x_ans = (v[i]*cos(q))*sqrt(2*(h+H)/9.8) + x;        if(x_ans<=R2&&x_ans>=L2)        {            return false;        }        if(x_ans<=R1&&x_ans>=L1)        {            temp++;        }    }    else    {        double t = ((-2*v[i]*cos(mid))+sqrt((-2*v[i]*cos(Pi))*(-2*v[i]*cos(Pi))-4*9.8*(-2*H)))/2.0/9.8;        if(t<0)            t = ((-2*v[i]*cos(mid))-sqrt((-2*v[i]*cos(Pi))*(-2*v[i]*cos(Pi))-4*9.8*(-2*H)))/2.0/9.8;        x_ans = v[i]*sin(mid)*t;        if(x_ans<=R2&&x_ans>=L2)        {            return false;        }        if(x_ans<=R1&&x_ans>=L1)        {            temp++;        }    }    return dfs(mid,i+1);}*/int main(){    while(scanf("%d",&N)&&N)    {        v.clear();        ans = 0;        scanf("%lf %lf %lf %lf %lf",&H,&L1,&R1,&L2,&R2);        for(int i=0; i<N; i++)        {            scanf("%lf",&V);            v.push_back(V);        }        //double        int f;        for(double i=0; i<Pi; i+=inc)        {            temp  = 0; f= 1;            for(int j=0; j<N; j++)            {                double vx,vy;                double a,b,c;                double x,t;                vx=sin(i)*v[j];                vy=cos(i)*v[j];                a=4.9;                b=vy;                c=-H;                t=(-b+sqrt(b*b-4*a*c))/(2*a);                x=vx*t;                if(x>=L2 && x<=R2)                {                    f=0;                    break;                }                if(x>=L1 && x<=R1) temp++;            }            if(f) ans  = max(ans,temp);        }        /*l = 0, r = Pi;        while(r-l>eps)        {           temp = 0;           mid = (l+r)/2;           midd = (r+mid)/2;           if(dfs(midd,0))             l = midd;             else               r =midd;        }        */        printf("%d\n",ans);    }    return 0;}


0 0