HDU 4445 Crazy Tank (2012年金华赛区现场赛D题)

题目大意:

  有一个坦克在高为H的地方,[l1.r1]为第一个区间,[l2,r2]为第二个区间,有n个不同炮弹,找到一个最好的角度使得任意一个不打在第二个区间内同时打在第一个区间内的炮弹最多。

当时就顾着想正规解法了,后来发现好多是暴力枚举过的。。。Orz,就差一个题就可以银牌了。。。

写个枚举角度的吧。。

代码:

 

 1 #include <algorithm>

 2 #include <iostream>

 3 #include <cstring>

 4 #include <cstdio>

 5 #include <cmath>

 6 using namespace std;

 7 const int maxn=1001;

 8 const double pi=acos(-1.0);

 9 const double G=9.8;

10 const double add=pi/1000;

11 double v[maxn];

12 double l1,r1,l2,r2,h;

13 int n;

14 int solve(double x)

15 {

16     int ans=0;

17     for(int i=0;i<n;i++)

18     {

19         double y0=v[i]*sin(x);

20         double x0=v[i]*cos(x);

21         double y=sqrt(2*G*h+y0*y0);

22         double t=(y-y0)/G;

23         double d=x0*t;

24         if(d>=l2&&d<=r2)

25             return 0;

26         if(d>=l1&&d<=r1)

27             ans++;

28     }

29     return ans;

30 }

31 int main()

32 {

33     int sum;

34     while(~scanf("%d",&n))

35     {

36         sum=0;

37         if(n==0)

38             break;

39         scanf("%lf%lf%lf%lf%lf",&h,&l1,&r1,&l2,&r2);

40         for(int i=0;i<n;i++)

41             scanf("%lf",&v[i]);

42         for(double j=-pi/2;j<=pi/2;j+=add)

43             sum=max(sum,solve(j));

44         printf("%d\n",sum);

45     }

46     return 0;

47 }

 

 

 

 

你可能感兴趣的:(2012)