洛谷 P1033 [NOIP2002 提高组] 自由落体

题目描述

在高为 �H 的天花板上有 �n 个小球,体积不计,位置分别为 0,1,2,⋯ ,�−10,1,2,⋯,n−1。在地面上有一个小车(长为 �L,高为 �K,距原点距离为 �1S1​)。已知小球下落距离计算公式为 �=0.5×�×(�2)d=0.5×g×(t2),其中 �=10g=10,�t 为下落时间。地面上的小车以速度 �V 前进。

如下图:

小车与所有小球同时开始运动,当小球距小车的距离 ≤0.0001≤0.0001 (感谢 Silver_N 修正) 时,即认为小球被小车接受(小球落到地面后不能被接受)。

请你计算出小车能接受到多少个小球。

输入格式

�,�1,�,�,�,�H,S1​,V,L,K,n(1≤�,�1,�,�,�,�≤1000001≤H,S1​,V,L,K,n≤100000)

输出格式

小车能接受到的小球个数。

输入输出样例

输入 #1复制

5.0 9.0 5.0 2.5 1.8 5

输出 #1复制

1

说明/提示

当球落入车的尾部时,算作落入车内。

【题目来源】

NOIP 2002 提高组第三题

位移(X)公式:�=�₀�+0.5��²X=V₀t+0.5at²,其中V₀是初速度,t为时间,a为加速度。

而自由落体(就是小球下落)的初速度为0,加速度等于重力加速度g

由此得知,自由落体运动位移(Y)公式:�=0.5��²Y=0.5gt²

基本的公式知道了我们就可以解决题目了了。

我们先读入double型变量H,S,V,L,K,n。

我们知道车高为k,故小球下落的最短运动距离为����((ℎ−�)/5sqrt((h−k)/5,那么此时接住小球编号为�−�∗(����((ℎ−�)/5)+�)s−v∗(sqrt((h−k)/5)+l);

最长运动距离为����(ℎ/5)sqrt(h/5),接住的小球编号为�−�∗����(ℎ/5)s−v∗sqrt(h/5)。

由于接住的小球编号不会超过�−1n−1也不会小于0(PS:编号是0—n-1!!!),所以最大的接住数量为�−1−0+1n−1−0+1即n个.

代码如下:

#include<bits/stdc++.h>
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 Maxtime=sqrt(h/5);
	double Mintime=sqrt((h-k)/5);
	int s=int(s1-Mintime*v+l);
	int e=int(s1-Maxtime*v);
	s=fmin(s,n);
	e=fmax(e,0);
	printf("%d",s-e);
	return 0;
}

拜拜! 

### NOIP2002 提高 字串变换 题解算法 #### 问题描述 给定两个字符串 \( A \) 和 \( B \),以及一系列转换规则,每个规则定义了一个模式匹配和替换操作。目标是从初始字符串 \( A \) 出发,在应用这些规则的情况下能否通过有限次的转换变成最终字符串 \( B \)[^1]。 #### 解决思路 该题目可以通过广度优先搜索 (BFS) 来解决。具体来说: - **初始化队列**:将起始状态即原始字符串加入到待处理的状态列表中。 - **遍历过程中的每一个节点**:对于当前正在考察的状态(也就是某个中间阶段形成的字符串),尝试利用所有的转换规则对其进行可能的变化;如果某一次变化的结果正好等于目的字符串,则找到了解决方案并结束程序运行; - **记录路径**:为了防止重复访问相同的状态造成死循环,还需要维护一个集合用于存储已经遇到过的所有不同形式的字符串实例。 #### BFS实现细节 下面是一个简单的Python代码片段来展示如何使用BFS求解这个问题: ```python from collections import deque def bfs_transform(start, end, rules): queue = deque([(start, [])]) visited = set([start]) while queue: current_str, path = queue.popleft() if current_str == end: return True, path for rule_from, rule_to in rules: pos = current_str.find(rule_from) while pos != -1: new_str = current_str[:pos] + rule_to + current_str[pos+len(rule_from):] if new_str not in visited and len(new_str) <= len(end): visited.add(new_str) queue.append((new_str, path + [(current_str, new_str)])) pos = current_str.find(rule_from, pos + 1) return False, [] rules = [("A", "BC"), ("BC", "CB"), ("C", "ABA")] print(bfs_transform("A", "CBABAC", rules)) ``` 此段代码实现了基本的功能框架,实际竞赛环境中还需考虑更多边界情况及性能优化措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值