当前位置: 首页 > article >正文

【NOIP提高组】 自由落体

【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💐点点关注,收藏不迷路💐

http://www.kler.cn/a/369155.html

相关文章:

  • Python小白学习教程从入门到入坑------第十八课 异常模块与包【上】(语法基础)
  • 网络学习/复习2套接字
  • Docker中如何控制服务启动顺序实现探讨
  • CSS中为特定的元素设置背景图片(Top1,Top1,Top3)
  • 设计模式(二)
  • Kafka如何控制消费的位置?
  • 网络编程 Linux环境 C语言实现
  • 电脑连接海康相机并在PictureBox和HWindowControl中分别显示。
  • Flink CDC系列之:学习理解核心概念——Data Source
  • “工业聚能 新质领航”|Softing 2024工博回顾:OPC DAY演讲“智能工厂中的OPC应用”
  • unity导入外部资源
  • 2D拓扑图
  • 912.排序数组(堆排序)
  • Diffusion原理及代码实现
  • 【学术会议论文投稿】深度解码:机器学习与深度学习的界限与交融
  • 【STM32编码器】【STM32】
  • Linux学习笔记 | sudo命令的基本使用
  • 鸿蒙HarmonyOS————ArkTs介绍(1)
  • [免费]SpringBoot+Vue智慧校园(校园管理)系统[论文+源码+SQL脚本]
  • 面试经典 150 题 第三周代码
  • Java 基于 poi 和 itextpdf 实现 excel 转 pdf
  • 安卓自定义文本组件
  • 网络搜索引擎Shodan(3)
  • Javascript数据结构——哈希表
  • 什么是排列树?
  • 【单片机运行的原理及应用方向】