hdu 4445 Crazy Tank
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> const double g = 9.8; using namespace std; double h,l1,r1,l2,r2;z double cal(double ang,double v) { double vx,vy; vx = v * sin(ang); vy = v * cos(ang); double t=(sqrt(vy*vy+2*g*h)-vy)/g; // vt + 1/2*g*t^2 = h return t*vx; } int main() { int n; double V[205]; const double PI = acos(-1.0); while(scanf("%d",&n)!=EOF && n) { scanf("%lf%lf%lf%lf%lf",&h,&l1,&r1,&l2,&r2); int ans=0; for(int i=1;i<=n;i++) scanf("%lf",&V[i]); double an=0; while(an<=PI) //因为是枚举的 所以就不能想着在上半个 90度就可以达到区域下半个90度也可以达到 { //所以误区就是只枚举上半个90度。 int tans=0; bool hit=false; for(int i=1;i<=n;i++) { float dis=cal(an,V[i]); if(dis<=r2 && dis>=l2) //题目说的是在不打到自己队友的前提下 所以一旦打到自己队友了 这个角度是作废的。 { hit=true; break; } if(dis<=r1 && dis>=l1) tans++; } if(tans>ans && !hit) ans=tans; an+=PI/1000; //枚举1000份 } cout<<ans<<endl; } return 0; }