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 }

 

 

 

 

转载于:https://www.cnblogs.com/pony1993/archive/2012/11/05/2755751.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值