1. 程式人生 > >P1033 自由落體

P1033 自由落體

can nbsp pac sum http info span 出了 分享圖片

原題鏈接 https://www.luogu.org/problemnew/show/P1033

不得不說,這個題太坑了!!!主要是題目說得不明確......

先來看圖:

技術分享圖片

看一下用紅圈圈起來的部分,就是說小車運動過程中如果有一個小球在小車的正前方(與小車的距離在0.0001m以內)且這個小球的高度在0~ch(車高),則可以接到這個球(很神奇吧,沒被撞飛)

還有就是如果有一個小球在小車的後方(與小車的距離在0.0001m以內)且這個小球的高度為ch,則也可以接到這個球

這樣看來,就引出了我的思路:

用for循環從0~n-1來判斷當車運動過程中小球是否在車的左下角和右上角的範圍內,在的話ans++

那麽怎麽求是否在車的左下角呢

小球落到左下角的高度為qh(球本來的高度),那麽所需時間為t=sqrt(qh/5),小車與原點的距離為s-sqrt(qh/5)*cv(車速),所以小球i只要>=s-sqrt(qh/5)*cv-0.0001就能接到

當然也要在小車的右上角範圍內: 這時小球落到左上角(與右上角一樣)的高度為qh-ch,那麽所需時間為t=sqrt((qh-ch)/5),小車左上角與原點的距離為s-sqrt((qh-ch)/5)*cv,小車右上角與原點的距離為s-sqrt((qh-ch)/5)*cv+ck,所以小球i也要<=s-sqrt((qh-ch)/5)*cv+ck+0.0001

下面給出代碼:

#include<iostream>

#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int main()
{
double qh,ch,ck,cv,s;
int n,sum=0;
scanf("%lf%lf%lf%lf%lf%d",&qh,&s,&cv,&ck,&ch,&n);
for(int i=0;i<n;i++)
{
if(i>=s-sqrt(qh/5)*cv-0.0001&&i<=s-sqrt((qh-ch)/5)*cv+ck+0.0001) sum++; //核心代碼,算出小球是否在車的左下角和右上角的範圍內
}
cout<<sum;
return 0;
}

P1033 自由落體