题目描述

在高为 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