首页 > 代码库 > HDU 4445 Crazy Tank --枚举
HDU 4445 Crazy Tank --枚举
题意: 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算出水平距离,直接统计即可。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#define pi acos(-1.0)#define eps 1e-8using namespace std;#define N 207#define g 9.8double 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;}
HDU 4445 Crazy Tank --枚举
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。