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-8 using 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; } View Code?
轉載于:https://www.cnblogs.com/whatbeg/p/4087470.html
總結
以上是生活随笔為你收集整理的HDU 4445 Crazy Tank --枚举的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android中将布局文件/View添加
- 下一篇: Ubuntu 使用 heirloom-m