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(物理题&枚举)的主要内容,如果未能解决你的问题,请参考以下文章
HDU-4389 X mod f(x) && 2018上海大都会邀请赛J 数位dp