题目描述
在高为 H 的天花板上有 n 个小球,体积不计,位置分别为 0,1,2,….n-1。在地面上有一个小车(长为 L,高为 K,距原点距离为 S1)。已知小球下落距离计算公式为 d=1/2g(t^2),其中 g=10,t 为下落时间。地面上的小车以速度 V 前进。如下图:
小车与所有小球同时开始运动,当小球距小车的距离 <= 0.00001 时,即认为小球被小车接受(小球落到地面后不能被接受)。请你计算出小车能接受到多少个小球。
输入描述:
输入H,S1,V,L,K,n (l<=H,S1,V,L,K,n<=100000)
输出描述:
输出小车能接受到的小球个数。
示例1
输入
5.0 9.0 5.0 2.5 1.8 5
输出
1
解法1
注:所有小球同时掉落,每个小球之间的距离是1m。
计算小球刚好落到小车以及刚好落到地上的时候小车走了多少米,再加上小车的宽度,在这两个位移之间的小球都是符合条件的。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
double H, S1, V, L, K, N ;
scanf("%lf %lf %lf %lf %lf %lf", &H, &S1, &V, &L, &K, &N );
double t, t1 ;
t = sqrt( (H-K)/5 );
t1 = sqrt(H/5);
double x, x1 ;
x = V*t;
x1 = V*t1;
double p = S1 - x;
double p1 = L+p ;
double p2 = (S1 - x1)+L ;
double p3 = S1 - x1;
double minn = min ( ( min(p,p1),p2 ),p3) ;
double maxn = max( (max(p,p1),p2 ),p3);
int ans = 0;
for(int i=0;i<=N-1;i++){
if(i>=minn&&i<=maxn){
ans++;
}
}
printf("%d",ans);
return 0;
}
想法是这样...但是过不了题目
ac的代码:
#include<cstdio>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
double h,s,v,l,k,n,t1,t2,x1,x2;
int count=0;
scanf("%lf %lf %lf %lf %lf %lf",&h,&s,&v,&l,&k,&n);
t1=sqrt((h-k)/5.0);
t2=sqrt(h/5.0);
x1=s-v*t2; //x1 = 4
x2=s+l-v*t1; // x2 = 7.5 找到最大和最小的位移:9-x当x最大时最小,9+l-x当x最小时最大
int minn = max (x1,0.0); //max min()中的两个数据必须是同一类型,此处右边的值为double,但赋值给左边
int maxn = min (x2,n*1.0); ///时强制转换成了int
printf("%d", maxn - minn ); //当小球在小车左边或右边距小车距离<=0.00001
//且未落地时也认为小球进入了小车
//样例中只有第5个小球能进入小车,范围应该是:(4,7.5】
//进行max min之后应该是:(4,5】
return 0;
}
#include<cmath>
int main()
{
double h,s,v,l,k,n,t1,t2,x1,x2;
int count=0;
scanf("%lf %lf %lf %lf %lf %lf",&h,&s,&v,&l,&k,&n);
t1=sqrt((h-k)/5.0);
t2=sqrt(h/5.0);
x1=s-v*t2;
x2=s+l-v*t1; //找到最大和最小的位移:9-x当x最大时最小,9+l-x当x最小时最大
for(int i=0;i<n;i++)
{
if(x1-i<=0.00001 && i-x2>=0.00001)
count++;
}
printf("%d",count);
return 0;
}
解法2
把小车看成静止的,上面的小球看成以v做平抛运动。
计算出当小球落到正方体(小车)的左上角时的水平位移,以及落到左下角时的水平位移,这两个水平位移再加上小车的宽度就是可以符合条件的小球所在的位置的范围。