直接使用速度公式求解,采用的是使用枚舉三角函數值來計算;
由發射塔到地面的速度公式為 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<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<queue>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
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;
}