天天看點

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;
}