zoukankan      html  css  js  c++  java
  • 题解 P1033 【自由落体】

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


    首先这个题其实就是转换一下参照系。
    由原先小车向小球靠拢换成小车静止,小球向着小车靠拢(原点设置成车右下角那个点)。
    然后就成了平抛运动...
    这就好办了,直接高中公式套上算二次函数的值就完了。

    [H(t)=h_1-{{1}over{2}} cdot gcdot t^2,g=10 ]

    所以每一个小球的坐标就是((vcdot t,H(t)))
    但是还没有完,我们需要转换坐标系,即让t变成到小车的距离。

    [S(t)=s_1-vcdot t ]

    最后小车坐标就变成了

    [(S(t),H(t)) ]

    两个函数套坐标里了QAQ (还是感觉这是物理题啊QAQ)
    算出时间

    [t_{tot}=sqrt{2h_1over g}=sqrt{h_1over 5},g=10 ]

    直接递推搞定。


    然后进入代码纠错阶段
    首先注意能开double不要放过
    其次注意让原先的状态向下转移(已经接到的就继续接到的状态)。
    总体时间复杂度(O(ncdot 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
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    删除 SQL Server 2005 Express 工具
    静态和非静态
    C#中的托管和非托管
    类和结构的区别
    asp.net URL DES加密 什在URL中的使用
    正则替换图片路径
    Oracle 正则 一行转多行
    Oracle 存储过程
    HTTP SOAP Request
    jquery 高亮
  • 原文地址:https://www.cnblogs.com/jelly123/p/10992280.html
Copyright © 2011-2022 走看看