题目描述
在高为 H 的天花板上有 n 个小球,体积不计,位置分别为 0,1,2,….n-1。在地面上有一个小车(长为 L,高为 K,距原点距离为 S1)。已知小球下落距离计算公式为 d=1/2*g*(t^2),其中 g=10,t 为下落时间。地面上的小车以速度 V 前进。如下图:
小车与所有小球同时开始运动,当小球距小车的距离 <= 0.00001 时,即认为小球被小车接受(小球落到地面后不能被接受)。
请你计算出小车能接受到多少个小球。
输入描述:
输入 ()
输出描述:
输出小车能接受到的小球个数。
示例1
输入
5.0 9.0 5.0 2.5 1.8 5
输出
1
解答
本题就是数学题,比较繁琐的是误差和特殊情况。
假设一个球i,它掉落到车顶的时间为t1,掉落到地上的时间为t2,则如果掉落到车顶时车的后排已经经过该点,或掉落到地上时车的前排还没有到达该点,则该点不会被接受。于是有:
综合考虑1e-5的误差,我们得出i的区间:,而接受的球数就是该区间内的整数个数。
代码如下(其实我觉得这个代码有不好的地方,但是能AC。。数据不强大。。):
#include <math.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { double t1, t2; double h, s1, v, l, k; double d1, d2; int g = 10; int n; scanf("%lf%lf%lf%lf%lf%d", &h, &s1, &v, &l, &k, &n); t1 = sqrt(2*(h -(k)) / g); t2 = sqrt(2 * h / g); d2 = s1 - v * t1 + l; d1 = s1 - v * t2; // printf("[%lf, %lf]\n", d1, d2); if(d1 < 0){ d1 = 0; } if(d2 > n){ d2 = n; } if(d1 > d2){ d1 = d2; } // printf("[%lf, %lf]\n", d1, d2); printf("%d\n", (int)(d2) - (int)(d1)); return 0; }
来源:zqynux