这题第一反映肯定是三分角度,然后求最大值。。但是有友方坦克的存在,如果一个角度会导致某个导弹打到友方坦克,那么返回结果直接是0。
所以只能萎缩地枚举角度了。。。。e中保存地方坦克的区间,f中保存友方坦克的区间。
#include<algorithm> #include<iostream> #include<cstring> #include<fstream> #include<sstream> #include<vector> #include<string> #include<cstdio> #include<bitset> #include<queue> #include<stack> #include<cmath> #include<map> #include<set> #define FF(i, a, b) for(int i=a; i<b; i++) #define FD(i, a, b) for(int i=a; i>=b; i--) #define REP(i, n) for(int i=0; i<n; i++) #define CLR(a, b) memset(a, b, sizeof(a)) #define debug puts("**debug**") #define LL long long #define PB push_back #define MP make_pair #define eps 1e-8 using namespace std; const double PI = acos(-1); const double g = 9.8; const int maxn = 222; int n; double v[maxn]; double l, r, l1, l2, r1, r2, H, a, b; struct Seg { double l, r; }; vector<Seg> e, f; template <class T> T sqr(T x){ return x*x; } int dcmp(double x) { if(fabs(x) < eps) return 0; return x > 0 ? 1 : -1; } bool check1(double m) { REP(i, e.size()) { double a=e[i].l, b=e[i].r; if(dcmp(m-a)>=0 && dcmp(b-m)>=0) return true; } return false; } bool check2(double m) { REP(i, f.size()) { double a=f[i].l, b=f[i].r; if(dcmp(m-a)>=0 && dcmp(b-m)>=0) return true; } return false; } int calc(double ang) { int ret = 0; REP(i, n) { double vy = -v[i]*sin(ang); double vx = v[i]*cos(ang); double t = vx * ((sqrt(sqr(vy)+2*H*g)-vy) / g); if(check1(t)) ret++; if(check2(t)) return 0; } return ret; } int main() { while(~scanf("%d", &n), n) { e.clear(); f.clear(); scanf("%lf%lf%lf%lf%lf", &H, &l1, &r1, &l2, &r2); REP(i, n) scanf("%lf", &v[i]); if(dcmp(l1-r2) > 0 || dcmp(l2-r1) > 0) { e.PB((Seg){l1, r1}); f.PB((Seg){l2, r2}); } else if(dcmp(l1-l2) > 0 && dcmp(r2-l1) >= 0 && dcmp(r1-r2) >= 0) { e.PB((Seg){r2, r1}); f.PB((Seg){l2, r2}); } else if(dcmp(r2-r1) > 0 && dcmp(l2-l1) >= 0 && dcmp(r1-l2) >= 0) { e.PB((Seg){l1, l2}); f.PB((Seg){l2, r2}); } else if(dcmp(l2-l1)>=0 && dcmp(r1-l2)>=0 && dcmp(r2-l1)>=0 && dcmp(r1-r2)>=0) { e.PB((Seg){l1, l2}); e.PB((Seg){r2, r1}); f.PB((Seg){l2, r2}); } else { e.PB((Seg){l1, r1}); f.PB((Seg){l2, r2}); } double L = -PI/2, R = PI/2; int ans = 0; while(L + eps < R) { L += PI/1000.0; int k = calc(L); ans = max(ans, k); } printf("%d\n", ans); } return 0; }