P1033 自由落體
阿新 • • 發佈:2019-03-27
can nbsp pac sum http info span 出了 分享圖片
#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;
}
原題鏈接 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<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 自由落體