今天和大家分享一道特別有意思的信息奧賽題目:學校大門外長度為L的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1米。我們可以把馬路看成一個數軸,馬路的一端在數軸0的位置,另一端在L的位置;數軸上的每個整數點,即0,1,2,……,L,都種有一棵樹。由于馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止點的坐標都是整數,區域之間可能有重合的部分。現在要把這些區域中的樹(包括區域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走后,馬路上還有多少棵樹。
【輸入文件】首先在文件的第一行輸入兩個整數L(1<=L<=10000)和M(1<=M<=100),L代表馬路的長度,M代表區域的數目,L和M之間用一個空格隔開。接下來的M行每行包含兩個不同的整數,用一個空格隔開,表示一個區域的起始點和終止點的坐標。輸出馬路上剩余的樹的數目。

其實在閱讀題目后,本想用Scratch來做,可是實際操作發現這個題目并不是那么的簡單,因為Scratch沒有像Python那樣可以分割字符串的空格,Scratch只能按照空格前后區分,這導致整體代碼量太大,而且代碼效率太低了。在思考了許久后,還是選擇了Python來進行解答。這樣不僅編程比較方便代碼量也大大減少,而且還通俗易懂。
首先需要輸入的是兩個代表馬路的長度和區域的數目。馬路長度可以確定總共的樹木的數量,例如馬路長為500,那么樹木的數量為500+1=501(左端從0開始)。那么問題就來了,如何保證把其中某些區域的樹給移動走,并且考慮區域之間樹的重合關系。首先我們可以把501棵樹木全部附上一個值(True),然后通過遍歷循環區域數目次數,把指定區域的樹由True變成False。在原有的基礎上進行覆蓋。最后進行累加便得到了最終總棵樹為298棵。
運用Python做出來的效果清晰明了。反過來大家可以思考一下已知Python的代碼,是否我們可以轉化成Scratch的代碼呢?是否還有更加簡單的代碼呢?一起來動動腦筋吧。
