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

P1033自由落體

ash spa pri cst n) print 小車 麻煩 pac

傳送

杯具wa,慘痛的教訓————別寫一些情況多到要打表的判斷,寫著寫著就wa了

這個題,我主要死在判斷上了

第一遍20分的思路:看小車此時跨越幾個整數點。因為我求出了此時小車的車頭坐標和車尾坐標。然鵝人家是double類型的。

判斷打表累死你~~~ ______可愛的打表(打表向我扔了一個unaccetp並表示不想理我)

難道我們只能從0到n-1判斷一遍了嗎???好吧只能這樣了(我的時間復雜度233)<---一位被TLE整怕了的蒟蒻。

其實這樣復雜度並不高,只有o(n)

判斷解決了,就很好辦了。這個題的小球很迷,它不會被車撞飛,而且它與車只差0.0001時會被接到(是在車前/後0.0001而不是在車上方0.0001(腦回路清奇的我思索了兩遍才意識到這個問題))。

因為直接分析略有麻煩,所以我們分兩段分析:

1.所有小球落到k(小車高度)時,小車接住的球數。設此時,小車頭坐標為s11,尾坐標為s12。則接住的球數為從0到n-1判斷一遍,看有幾個球在[s11,s12]中。

2.小球從k落到地面時,小車接住的球數。設此時小車頭坐標為s21,則又接住的球數為從0到n-1判斷,看有幾個球在[s21,s12]中。

技術分享圖片

以上兩次接住的球數加起來就是答案。(畫工有限,忍一忍吧233)

代碼奉上:

#include<iostream>
#include<cstdio>
#include<cmath>
#include
<cstring> #include<algorithm> using namespace std; double g=10,s1,h,v,l,k,n,t1,s[3][3],t2; int ans; int main() { scanf("%lf%lf%lf%lf%lf%lf",&h,&s1,&v,&l,&k,&n); t1=sqrt((h-k)/5.0000);//t1用來求s11,s12; s[1][1]=s1-v*t1;s[1][2]=s[1][1]+l; for(int i=0;i<n;i++) {
if(i>=s[1][1]-0.0001&&i<=s[1][2]+0.0001)ans++; }//判斷 t2=sqrt(h/5.0000)-t1; s[2][1]=s[1][1]-v*t2; for(int i=0;i<n;i++) {if(i>=s[2][1]-0.0001&&i<=s[1][1]-0.0001)ans++; } printf("%d",ans); }

P1033自由落體