HDU4445

http://acm.hdu.edu.cn/showproblem.php?pid=4445

题意: 在高度为H的位置一部坦克, 你可以调整任意角度一次, 发射n发炮弹, 不可以击中队友,
问你最大可以击中敌人的次数.
 
2. a的取值0~pi(3.1415926), 在某一个角度出现最大值, 枚举阀值eps = pi/1000.

主要是角度不同,投得地方不同,若投到友方区域,直接返回0;

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
const double PI=acos(-1.0*1);
const double g=9.8;
double H,L1,R1,L2,R2;
double V0[205];
int n;
int ff(double x) //定义一个角度
{
    int num=0;
    for(int i=0;i<n;i++)
    {
        double Vx=V0[i]*cos(x);//水平方向的速度
        double Vy=V0[i]*sin(x);//垂直方向的速度
        double a=g/2;
        double b=Vy;
        double c=-H;
        double t=(-b+sqrt(b*b-4*a*c))/(2*a);
        double d=t*Vx;

        if(d>=L2&&d<=R2) return 0;
        if(d>=L1&&d<=R1) num++;
    }
    return num;

}
int main()
{

   while(scanf("%d",&n)!=EOF)
   {
       if(n==0) break;
       scanf("%lf%lf%lf%lf%lf",&H,&L1,&R1,&L2,&R2);
       for(int i=0;i<n;i++)
       {
           scanf("%lf",&V0[i]);
       }
       double add=PI/1000;
       int ans=0;
       for(double x=-PI/2;x<PI/2;x+=add)
       {
           ans=max(ans,ff(x));
       }
       printf("%d\n",ans);
   }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值