【NOIP提高组】 自由落体
💐The Begin💐点点关注,收藏不迷路💐
|
在高为 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)
输出
小车能接受到的小球个数。
样例输入
5.0 9.0 5.0 2.5 1.8 5
样例输出
1
用 C 语言实现的代码:
#include <stdio.h>
#include <math.h>
// 定义极小数 eps 和重力加速度常量 g
const double eps = 1e-4;
const double g = 10;
// 判断能否接住小球的函数
bool check(double ceilH, double carS, double carV, double carL, double carH, double ballP) {
// 根据公式计算接住小球允许的最小车速
double minV = (carS - ballP - eps) * sqrt(g / 2 / ceilH);
// 根据公式计算接住小球允许的最大车速
double maxV = (carS + carL - ballP + eps) * sqrt(g / 2 / (ceilH - carH));
// 判断实际车速是否在允许的车速范围内
return minV <= carV && carV <= maxV;
}
// 主函数中的工作函数
void process() {
double ceilH, carS, carV, carL, carH, numB;
int count = 0;
// 输入天花板高度、车距原点距离、车速、车长、车高、小球数量
scanf("%lf %lf %lf %lf %lf %lf", &ceilH, &carS, &carV, &carL, &carH, &numB);
for (double i = 0; i < numB && i <= carS; i++) {
// 对每个小球判断是否能被接住
count += check(ceilH, carS, carV, carL, carH, i)? 1 : 0;
}
// 输出能接住的小球个数
printf("%d\n", count);
}
int main() {
int t = 1;
// 循环次数,这里设置为 1
while (t--) {
// 执行工作函数
process();
}
return 0;
}
用 C++实现的代码:
#include <iostream>
#include <cmath>
// 定义极小数 eps 和重力加速度常量 g
const double eps = 1e-4;
const double g = 10;
// 判断能否接住小球的函数
bool check(double ceilH, double carS, double carV, double carL, double carH, double ballP) {
// 根据公式计算接住小球允许的最小车速
double minV = (carS - ballP - eps) * sqrt(g / 2 / ceilH);
// 根据公式计算接住小球允许的最大车速
double maxV = (carS + carL - ballP + eps) * sqrt(g / 2 / (ceilH - carH));
// 判断实际车速是否在允许的车速范围内
return minV <= carV && carV <= maxV;
}
int main() {
double ceilH, carS, carV, carL, carH, numB;
int count = 0;
// 输入天花板高度、车距原点距离、车速、车长、车高、小球数量
std::cin >> ceilH >> carS >> carV >> carL >> carH >> numB;
for (double i = 0; i < numB && i <= carS; i++) {
// 对每个小球判断是否能被接住
count += check(ceilH, carS, carV, carL, carH, i)? 1 : 0;
}
// 输出能接住的小球个数
std::cout << count << std::endl;
return 0;
}
用 Java 实现的代码:
import java.util.Scanner;
class Main{
// 定义极小数 eps 和重力加速度常量 g
private static final double eps = 1e-4;
private static final double g = 10;
// 判断能否接住小球的方法
public static boolean check(double ceilH, double carS, double carV, double carL, double carH, double ballP) {
// 根据公式计算接住小球允许的最小车速
double minV = (carS - ballP - eps) * Math.sqrt(g / 2 / ceilH);
// 根据公式计算接住小球允许的最大车速
double maxV = (carS + carL - ballP + eps) * Math.sqrt(g / 2 / (ceilH - carH));
// 判断实际车速是否在允许的车速范围内
return minV <= carV && carV <= maxV;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double ceilH, carS, carV, carL, carH, numB;
int count = 0;
// 输入天花板高度、车距原点距离、车速、车长、车高、小球数量
ceilH = scanner.nextDouble();
carS = scanner.nextDouble();
carV = scanner.nextDouble();
carL = scanner.nextDouble();
carH = scanner.nextDouble();
numB = scanner.nextDouble();
for (double i = 0; i < numB && i <= carS; i++) {
// 对每个小球判断是否能被接住
count += check(ceilH, carS, carV, carL, carH, i)? 1 : 0;
}
// 输出能接住的小球个数
System.out.println(count);
}
}
用 Python 实现的代码:
eps = 1e-4
g = 10
# 判断能否接住小球的函数
def check(ceilH, carS, carV, carL, carH, ballP):
# 根据公式计算接住小球允许的最小车速
minV = (carS - ballP - eps) * (g / 2 / ceilH)**0.5
# 根据公式计算接住小球允许的最大车速
maxV = (carS + carL - ballP + eps) * (g / 2 / (ceilH - carH))**0.5
# 判断实际车速是否在允许的车速范围内
return minV <= carV and carV <= maxV
ceilH, carS, carV, carL, carH, numB = map(float, input().split())
count = 0
# 对每个小球判断是否能被接住
for i in range(int(numB)):
if i <= carS and check(ceilH, carS, carV, carL, carH, i):
count += 1
# 输出能接住的小球个数
print(count)
💐The End💐点点关注,收藏不迷路💐
|