题目描述
在高为 H 的天花板上有 n 个小球,体积不计,位置分别为0,1,2,⋯,n−1。在地面上有一个小车(长为 L,高为 K,距原点距离为 S1)。已知小球下落距离计算公式为 ,其中 g=10,t 为下落时间。地面上的小车以速度 V 前进。
如下图:
小车与所有小球同时开始运动,当小球距小车的距离 ≤0.0001 (感谢 Silver_N 修正) 时,即认为小球被小车接受(小球落到地面后不能被接受)。
请你计算出小车能接受到多少个小球。
输入格式
H,S1,V,L,K,n(1≤H,S1,V,L,K,n≤100000)
输出格式
小车能接受到的小球个数。
输入输出样例
输入 #1复制
5.0 9.0 5.0 2.5 1.8 5
输出 #1复制
1
说明/提示
当球落入车的尾部时,算作落入车内。
思路:该题由于n的数据范围较小,可以暴力的研究每个小球是否可以被接到,时间复杂度为O(n)。利用高中物理相关知识,利用公式 求得t,对第i个小球的水平距离已知,利用求出要接到该球的车速范围。
还有相关的0.0001的数据误差也要考虑进来,不然会WA一个数据,太蒟蒻了,以为那是相对误差,因此没有考虑,但碰运气考虑一下就AC了。最后仔细一想,好吧,它有单位的,这是绝对误差。
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn=5e5+34;
double eps=1e-4,g=10;
bool physics(double H,double s,double v,double l,double h,double ball){
double min_v=1.0*(s-ball-eps)*sqrt(1.0*g/2/H);//接住小球允许的最小车速
double max_v=1.0*(s+l-ball+eps)*sqrt(1.0*g/2/(H-h));//接住小球允许的最大车速
return min_v<=v&&v<=max_v;
}
void work(){
double H,s,v,l,h;//H球高度,s车距,v车速,l车长,h车高
double n;
int cnt=0;
scanf("%lf%lf%lf%lf%lf%lf",&H,&s,&v,&l,&h,&n);
for(double i=0;i<n&&i<=s;i++)cnt+=physics(H,s,v,l,h,i);
printf("%d\n",cnt);
}
int main()
{
int t=1;
// scanf("%d",&t);
while(t--)
work();
return 0;
}