今天和大家分享一道特別有意思的信息奧賽題目:學(xué)校大門外長(zhǎng)度為L(zhǎng)的馬路上有一排樹,每?jī)煽孟噜彽臉渲g的間隔都是1米。我們可以把馬路看成一個(gè)數(shù)軸,馬路的一端在數(shù)軸0的位置,另一端在L的位置;數(shù)軸上的每個(gè)整數(shù)點(diǎn),即0,1,2,……,L,都種有一棵樹。由于馬路上有一些區(qū)域要用來(lái)建地鐵。這些區(qū)域用它們?cè)跀?shù)軸上的起始點(diǎn)和終止點(diǎn)表示。已知任一區(qū)域的起始點(diǎn)和終止點(diǎn)的坐標(biāo)都是整數(shù),區(qū)域之間可能有重合的部分。現(xiàn)在要把這些區(qū)域中的樹(包括區(qū)域端點(diǎn)處的兩棵樹)移走。你的任務(wù)是計(jì)算將這些樹都移走后,馬路上還有多少棵樹。
【輸入文件】首先在文件的第一行輸入兩個(gè)整數(shù)L(1<=L<=10000)和M(1<=M<=100),L代表馬路的長(zhǎng)度,M代表區(qū)域的數(shù)目,L和M之間用一個(gè)空格隔開(kāi)。接下來(lái)的M行每行包含兩個(gè)不同的整數(shù),用一個(gè)空格隔開(kāi),表示一個(gè)區(qū)域的起始點(diǎn)和終止點(diǎn)的坐標(biāo)。輸出馬路上剩余的樹的數(shù)目。
其實(shí)在閱讀題目后,本想用Scratch來(lái)做,可是實(shí)際操作發(fā)現(xiàn)這個(gè)題目并不是那么的簡(jiǎn)單,因?yàn)镾cratch沒(méi)有像Python那樣可以分割字符串的空格,Scratch只能按照空格前后區(qū)分,這導(dǎo)致整體代碼量太大,而且代碼效率太低了。在思考了許久后,還是選擇了Python來(lái)進(jìn)行解答。這樣不僅編程比較方便代碼量也大大減少,而且還通俗易懂。
首先需要輸入的是兩個(gè)代表馬路的長(zhǎng)度和區(qū)域的數(shù)目。馬路長(zhǎng)度可以確定總共的樹木的數(shù)量,例如馬路長(zhǎng)為500,那么樹木的數(shù)量為500+1=501(左端從0開(kāi)始)。那么問(wèn)題就來(lái)了,如何保證把其中某些區(qū)域的樹給移動(dòng)走,并且考慮區(qū)域之間樹的重合關(guān)系。首先我們可以把501棵樹木全部附上一個(gè)值(True),然后通過(guò)遍歷循環(huán)區(qū)域數(shù)目次數(shù),把指定區(qū)域的樹由True變成False。在原有的基礎(chǔ)上進(jìn)行覆蓋。最后進(jìn)行累加便得到了最終總棵樹為298棵。
運(yùn)用Python做出來(lái)的效果清晰明了。反過(guò)來(lái)大家可以思考一下已知Python的代碼,是否我們可以轉(zhuǎn)化成Scratch的代碼呢?是否還有更加簡(jiǎn)單的代碼呢?一起來(lái)動(dòng)動(dòng)腦筋吧。