给出两个坦克位置,N个炮弹,从(0,h)点以一定角度射出,问在某一角度下能够打到第一个坦克的炮弹最多个数,要求在该角度下所有炮弹都不会打到第二个坦克。
可以暴力水过,枚举角度判断即可
需要几个几何公式化简:
x=v*sinθ*t
v*cosθ*t+g*t*t/2=h
注意sin 和 cos 函数用多会超时
#include "stdio.h" #include "string.h" #include "math.h" double pi=acos(-1.0); int main() { int n,j,sum,ok,sb,ans; double a,H,h,l1,r1,l2,r2,key,b,c,t,x,i,t1,t2,vx,vy; double v[210]; while (scanf("%d",&n)!=EOF) { if (n==0) break; scanf("%lf%lf%lf%lf%lf",&H,&l1,&r1,&l2,&r2); for (j=1; j<=n; j++) scanf("%lf",&v[j]); if (l2<=l1 && r2>=r1) { printf("0\n"); continue; } ans=0; sum=0; for (i=0; i<3.1415926; i+=0.0007) { sum=0; ok=1; for (j=1;j<=n;j++) { a=4.9; b=-v[j]*cos(i); c=-H; t=(-b+sqrt(b*b-4*a*c))/9.8; x=sin(i)*v[j]*t; if (x>=l2 && x<=r2 ) { ok=0; break; } if (x>=l1 && x<=r1 ) sum++; } if (ok==1 && sum>=ans) ans=sum; // if (ans==n) break; } printf("%d\n",ans); } return 0; }
时间: 2024-11-09 04:02:19