試題B:小球反彈(第十五屆藍橋杯省賽B組c/c++組)

最爱小糖果發表於2024-04-19

試題B:小球反彈

我在刷部落格的時候看見有人分享了藍橋杯的題目,我想起了我之前大學打藍橋杯刷題的時光,還是很懷念當時打比賽的氛圍,關於這個小球反彈的題目,我感覺很有意思,我一開始也是走了好多彎路,然後去上了一個廁所,突然茅塞頓開,想到了一個很簡單的方法,也看了一圈大家對這道題的結局方法,基本上以遍歷列舉出結果為主,和我的思路不太一樣,所有想分享給大家看一下我的想法,大家可以先看一下題目呢

錯誤嘗試

我剛看到這個題目的時候,我最先想到的方法是透過定義y=kx+b的方式來模擬小球反彈的運動曲線,然後透過這個曲線方程來看他到底是碰到了長方形的長還是長方形的寬,因為透過一元一次方程來模擬運動函式,基本上來說k的就兩個值在變要麼k=17/15要麼k=-17/15,需要改變的只有b,每一次反彈k就是上一次的k的負數,而b=y-kx,所有隻需要,每一次反彈就改變一次k和b就可以得到新的y=kx+b,但這樣需要每一次都判斷長方形的邊,因為你要判斷小球反彈的是長方形的長還是寬,這樣判斷就太複雜了,所有我後面放棄了這個方法

茅塞頓開後的想法

我在想這個小球反彈的時候,突然想到,每一次反彈看似還在一個長方形內,實際上,不就是對原來的長方形對摺一下,形成了兩個長方形嗎?

如果這樣想法,實際上小球的運動規矩,就是一直沿著一個方向一直一直往前走,而這個長方形就一直在複製,如果先碰到的是寬,就往右邊翻轉一個,如果是先碰到長,就往下複製一個長方形

那麼依據這個想法就相當於我只需要計算小球從左上方一直往下走,隨著長方形的翻轉,一直走到了翻轉複製後的大長方形的右下角,這個路程就是小球回到原點的路程,這個問題就變成了,我們需要對這個長方形向左負責多少個,向下複製多少,才能讓小球剛好到底右下角,那我們假設長方形向左邊複製了CopyX個,向下複製了CopyY個,而又因為小球往x方向運動和往y方向運動的比例是15/17,相當於我們最終得到的這個大的長方形的長寬比肯定也是要是15/17,所以得到方程

然後透過移動

然後我們知道翻轉的次數肯定是一個正整數,相當於我們就是隻需要對右邊的分數,進行通分得到它的最小分數形式就可以,那麼就是我們,如果考場上沒有計算器,需要透過程式碼來弄,就只需寫一個求解最小公因數的函式,就可以快速的化簡這個分數,最終得到的結果是

那麼我們就得到CopyX=1059CopyY=1768,後面就用勾股定理來計算小球的運動規矩最終得到的值是dic =550162599.8851975

遺漏點

對於上面的結果大家是不是很奇怪,好像不是正確答案呀,是不是我們遺漏了什麼呢,實際上遺漏的東西,就是我們最終求解的是小球從左上角到右下角的路程,而題目要求是求小球回到原點的路程,那麼如果要回到原點實際上是我們剛剛求的結果X2,就可以了,相當於小球進行原路返回,我舉例一個簡單的例子

因此我們最終的答案是距離=1100325199.77(四捨五入)

相關文章