hdu4445-Crazy Tank

2014-11-24 01:44:16 · 作者: · 浏览: 1

直接使用速度公式求解,采用的是使用枚举三角函数值来计算;


由发射塔到地面的速度公式为 v0 * v0 - vy * vy = 2 * g * h ( v0 为末速度,均为竖直方向的速度 )

然后计算水平距离l ,使用l 与敌方和友方坐标进行比较, 当位于友方坐标内,直接跳出循环 ;

[cpp]
// File Name: 4445.cpp
// Author: bo_jwolf
// Created Time: 2013年05月24日 星期五 13:28:41

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;
int n ;
double h , l1 , r1 ,l2 , r2 ;
const int maxn = 1005 ;
double a[ maxn ] ;
const double g = -9.8 ;

int ff( int x )
{
double sy = x / 10000.0 ;
double sx = sqrt( 1.0 - sy * sy ) ;
int sum = 0 ;
for(int i = 0 ; i < n ; i++ )
{
double vy = a[ i ] * sy ;
double t = ( - 1.0 *vy - sqrt( vy * vy + 2 * g * h ) ) / g ;
double l = a[ i ] * sx * t ;
if( l >= l2 && l <= r2 )
return 0 ;
if( l >= l1 && l <= r1 )
sum++ ;
}
return sum ;
}

int main()
{
int Case ;
int ans ;
// freopen("cin.txt", "r", stdin);
while( scanf( "%d" , &n ) && n)
{
scanf( "%lf%lf%lf%lf%lf" , &h , &l1 , &r1 , &l2 ,&r2 ) ;
for( int i = 0 ; i < n ; i++ )
{
scanf( "%lf" , &a[ i ] ) ;
}
ans = 0 ;
h = -1.0 * h ;
for(int i = -10000 ; i < 10000 ; i++ )
{
int x = ff( i ) ;
if( x > ans )
ans = x ;
}
printf( "%d\n" , ans ) ;

}
return 0;
}