天天看点

noip2002 自由落体 (物理)

P1125自由落体

​​Accepted​​

标签:

​​模拟​​​

​​​NOIP提高组2002​​

描述

在高为 H 的天花板上有 n 个小球,体积不计,位置分别为 0,1,2,….n-1。在地面上有一个小车(长为 L,高为 K,距原点距离为 S1)。已知小球下落距离计算公式为 d=1/2*g*(t^2),其中 g=10,t 为下落时间。地面上的小车以速度 V 前进。

小车与所有小球同时开始运动,当小球距小车的距离 <= 0.00001 时,即认为小球被小车接受(小球落到地面后不能被接受)。

请你计算出小车能接受到多少个小球。

格式

输入格式

输人:

H,S1,V,L,K,n (l<=H,S1,V,L,K,n <=100000)

输出格式

小车能接受到的小球个数。

样例1

样例输入1[复制]

5.0 9.0 5.0 2.5 1.8 5

样例输出1[复制]

1

限制

每个测试点1s

提示

原题中是附带有图解的,小车位于原点的右侧(数轴的正半轴),小车的左端与原点距离为S1,小车以速度V向原点行驶。

来源

noip2002提高组第三题

解析:所有的球是同时下落的,基本思路就是求出小球所能接到球的一个范围[x,y],

          [x,y]∩{z|z>=0,z<=n-1,z是整数}即为本题的解。

          设z=0.00001,

          求取左界x:x1=s-sqrt(h/5)*v ,表示小球落地时的小车前端所处位置,x=x1-z;

          求取右界y:k+sqrt(z)表示小球下落过程中恰好被小车前端左上点接住的最高高度,并且在这个位置时,小车的右端是处于离远点最远的地方。

                           y1=s+l-sqrt((h-k-sqrt(z))/5),表示此时小车右端所处的位置,y=y1+z;

代码:

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;

const double precision=1e-6;

int main()
{
  freopen("1.in","r",stdin);
  double h,s,v,l,k,x,y,z=1e-5;
  int n,p,q;
  scanf("%lf%lf%lf%lf%lf%d",&h,&s,&v,&l,&k,&n);
  
  x=s-sqrt(h/5)*v-z,p=(int)x;
  if(x-p>precision)p++;
  
  y=h-k-sqrt(z),y=max(0.0,y);
  y=s+l-sqrt(y/5)*v+z,q=(int)y;
  p=max(0,p),q=min(n-1,q);
  printf("%d\n",max(0,q-p+1));
  return 0;
}