P1033自由落體
阿新 • • 發佈:2019-04-02
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自由落體