首页 > 其他 > 详细

HDU 4445 Crazy Tank --枚举

时间:2014-11-10 17:35:01      阅读:153      评论:0      收藏:0      [点我收藏+]

题意: n个物体从高H处以相同角度抛下,有各自的初速度,下面[L1,R1]是敌方坦克的范围,[L2,R2]是友方坦克,问从某个角度抛出,在没有一个炮弹碰到友方坦克的情况下,最多的碰到敌方坦克的炮弹数。

解法: 枚举角度,将pi/2分成1000份,然后枚举,通过方程 v*sin(theta)*t - 1/2*g*t^2 = -H 解出t,然后 x = v*cos(theta)*t算出水平距离,直接统计即可。

代码:

bubuko.com,布布扣
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define pi acos(-1.0)
#define eps 1e-8
using namespace std;
#define N 207
#define g 9.8

double V[N];
double H;

int sgn(double x)
{
    if(x > eps) return 1;
    if(x < -eps) return -1;
    return 0;
}

double calc(double theta,double v)
{
    double up = v*sin(theta) + sqrt(v*v*sin(theta)*sin(theta)+2.0*g*H);
    double down = g;
    return v*cos(theta)*up/down;
}

int main()
{
    double L1,R1,L2,R2;
    int n,i,j;
    while(scanf("%d",&n)!=EOF && n)
    {
        scanf("%lf%lf%lf%lf%lf",&H,&L1,&R1,&L2,&R2);
        if(sgn(L1-L2) == 0 && sgn(R1-R2) == 0) { puts("0"); continue; }
        for(i=1;i<=n;i++) scanf("%lf",&V[i]);
        double delta = pi*0.001;
        int Maxi = 0;
        for(i=0;i<=1000;i++)
        {
            double theta = delta*i - pi/2.0;
            int cnt = 0;
            for(j=1;j<=n;j++)
            {
                double x = calc(theta,V[j]);
                if(sgn(x-L2) >= 0 && sgn(x-R2) <= 0)
                {
                    cnt = 0;
                    break;
                }
                if(sgn(x-L1) >= 0 && sgn(R1-x) >= 0)
                    cnt++;
            }
            Maxi = max(Maxi,cnt);
        }
        cout<<Maxi<<endl;
    }
    return 0;
}
View Code

 

HDU 4445 Crazy Tank --枚举

原文:http://www.cnblogs.com/whatbeg/p/4087470.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!