HDU 4445(物理题&枚举)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 4445(物理题&枚举)相关的知识,希望对你有一定的参考价值。

HDU 4445(物理题&枚举)

[ − π 2 , π 2 ] [-\\dfrac{\\pi}{2},\\dfrac{\\pi}{2}] [2π,2π]分成 1000 1000 1000份枚举,然后利用物理公式计算 O ( n ) O(n) O(n)扫一遍。

代码来自参考

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
const int MAXN=200+5;
const double PI=acos(-1.0);//定义π大小
const double g=9.8;
double v[MAXN],L1,R1,L2,R2,H;
int n;

int meiju(double x)//角度为x;
{
    int ans=0;
    for(int i=0;i<n;i++)
    {
        double Vy0=v[i]*sin(x); //竖直分量的初速度,当向上发射时,为-PI,初速度的竖直分量为负
        double Vx0=v[i]*cos(x); //水平分量的速度不变
        double Vy=sqrt(2*g*H+Vy0*Vy0); //矢量位移公式Vy*Vy-Vy0*Vy0=2gH,H为竖直分量上的位移大小。注意规定向下为正方向后,Vy肯定为正数,绝对值直接去掉
        double t=(Vy-Vy0)/g; //如果Vy0是向上打的,则为负,速度变化量相当于两个速度的相加,除以加速度,得出时间
        double d=Vx0*t;
        
        if(d>=L2&&d<=R2)
            return 0;
        if(d>=L1&&d<=R1)
            ans++;
    }
    return ans;
}
int main()
{
    while(scanf("%d",&n)!=EOF && n)
    {
        scanf("%lf%lf%lf%lf%lf",&H,&L1,&R1,&L2,&R2);
        for(int i=0;i<n;i++)
          scanf("%lf",&v[i]);
          
        double add=PI/1000;//最好分细一点
        
        int ans=0;

        for(double x=-PI/2;x<=PI/2;x+=add) //角度从竖直向上开始打到竖直向下,一个π的范围
          ans=max(ans,meiju(x));
        printf("%d\\n",ans);
    }
    return 0;
}

以上是关于HDU 4445(物理题&枚举)的主要内容,如果未能解决你的问题,请参考以下文章

hdu1172(枚举)

HDU 5752 Sqrt Bo枚举,大水题

hdu5616 暴力枚举

HDU-4389 X mod f(x) && 2018上海大都会邀请赛J 数位dp

HDU 4968(杭电多校#9 1009题)Improving the GPA (瞎搞)

PAT1049-----枚举法,找规律题,注意降低时间复杂度