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