首页 > 代码库 > hdu 4445 Crazy Tank(物理过程枚举)

hdu 4445 Crazy Tank(物理过程枚举)

遇到物理题,千万不要一味的当成物理题去想着推出一个最终结果来,这样ACM竞赛成了物理比赛,出题人就没水平了。。。往往只需要基础的物理分析,然后还是用算法去解决问题。这题n小于等于200,一看就估计是暴力枚举能过。就枚举角度就行了。

 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<cmath> 7 #include<map> 8 #include<set> 9 #include<vector>10 #include<algorithm>11 #include<stack>12 #include<queue>13 #include<cctype>14 #include<sstream>15 using namespace std;16 #define pii pair<int,int>17 #define LL long long int18 const int eps=1e-8;19 const int INF=1000000000;20 const int maxn=100000+10;21 const double pi=acos(-1);22 const double ds=pi/1000;23 const double g=9.8;24 double l1,l2,r1,r2,h,v[210];25 int ans,n;26 int gao(double t)27 {28     int res=0;29     for(int i=0;i<n;i++)30     {31         double vx=v[i]*cos(t);32         double vy=v[i]*sin(t);33         double vt=sqrt(2*g*h+vy*vy);34         double t=(vt-vy)/g;35         double d=vx*t;36         if(d>=l2&&d<=r2) return 0;37         else38         {39             if(d>=l1&&d<=r1)40             {41                 res++;42             }43         }44     }45     return res;46 }47 int main()48 {49     //freopen("in8.txt","r",stdin);50     while(scanf("%d",&n)==1&&n)51     {52         scanf("%lf%lf%lf%lf%lf",&h,&l1,&r1,&l2,&r2);53         for(int i=0;i<n;i++)54         {55             scanf("%lf",&v[i]);56         }57         ans=0;58         for(double i=-(pi/2);i<=(pi/2);i+=ds)59         {60             ans=max(ans,gao(i));61         }62         printf("%d\n",ans);63     }64     return 0;65 }

 

hdu 4445 Crazy Tank(物理过程枚举)