hdu 4445 Crazy Tank

来源:互联网 发布:数据录入员工资 编辑:程序博客网 时间:2024/06/06 01:11
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>const double g = 9.8;using namespace std;double h,l1,r1,l2,r2;zdouble cal(double ang,double v){    double vx,vy;    vx = v * sin(ang);    vy = v * cos(ang);    double t=(sqrt(vy*vy+2*g*h)-vy)/g;     //   vt + 1/2*g*t^2 = h       return t*vx;}int main(){    int n;    double V[205];    const double PI = acos(-1.0);    while(scanf("%d",&n)!=EOF && n)    {        scanf("%lf%lf%lf%lf%lf",&h,&l1,&r1,&l2,&r2);        int ans=0;        for(int i=1;i<=n;i++)        scanf("%lf",&V[i]);        double an=0;        while(an<=PI)   //因为是枚举的  所以就不能想着在上半个 90度就可以达到区域下半个90度也可以达到           { //所以误区就是只枚举上半个90度。            int tans=0;            bool hit=false;            for(int i=1;i<=n;i++)            {                float dis=cal(an,V[i]);                if(dis<=r2 && dis>=l2)   //题目说的是在不打到自己队友的前提下  所以一旦打到自己队友了  这个角度是作废的。                {                    hit=true;                    break;                }                if(dis<=r1 && dis>=l1)                      tans++;            }            if(tans>ans && !hit)            ans=tans;            an+=PI/1000;   //枚举1000份        }        cout<<ans<<endl;    }    return 0;}