题解 P1033 【自由落体】

太坑人了
这不是明摆着坑那些没有学完初中物理的同学们
QAQ


首先这个题其实就是转换一下参照系。
由原先小车向小球靠拢换成小车静止,小球向着小车靠拢(原点设置成车右下角那个点)。
然后就成了平抛运动...
这就好办了,直接高中公式套上算二次函数的值就完了。
\[H(t)=h_1-{{1}\over{2}} \cdot g\cdot t^2,g=10\]
所以每一个小球的坐标就是\((v\cdot t,H(t))\)
但是还没有完,我们需要转换坐标系,即让t变成到小车的距离。
\[S(t)=s_1-v\cdot t\]
最后小车坐标就变成了
\[(S(t),H(t))\]
两个函数套坐标里了QAQ (还是感觉这是物理题啊QAQ)
算出时间
\[t_{tot}=\sqrt{2h_1\over g}=\sqrt{h_1\over 5},g=10\]
直接递推搞定。


然后进入代码纠错阶段
首先注意能开double不要放过
其次注意让原先的状态向下转移(已经接到的就继续接到的状态)。
总体时间复杂度\(O(n\cdot h_1)\)
但是窝好像只过了两个点
还请各位dalao帮忙纠正QAQ

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;
double eps=0.0001;
double lx,uy;
double h1,v,s1,L;
int n,ans;
bool f[100001];
//left x,right x,up y,down y

bool pd(double x,double y)
{
    return x<=lx+eps && x<=0.0000-eps && y>=0.0000 && y<=uy+eps;
}
double H(double t)
{
    return h1-5*t*t;
}
double S(double t)
{
    return s1+L-v*t;
}

void work()
{
    double tot=int(sqrt(h1/5));
    for (double t=0.0;H(t)+eps>=0;t+=0.1)
    {
        for (register int i=0;i<n;i++)
        {
            f[i]=f[i]||pd(S(t),H(t));
        }
    }
    for (int i=0;i<n;i++)
        ans+=f[i];
}

int main()
{
    double L;
    scanf("%lf %lf %lf %lf %lf %d",&h1,&s1,&v,&L,&uy,&n);
    lx=L+0.0000;
    work();
    printf("%d\n",ans);
    return 0;
}

转载于:https://www.cnblogs.com/jelly123/p/10992280.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值