1. 程式人生 > >【演算法習題】校園兩旁的樹

【演算法習題】校園兩旁的樹

問題描述

某校大門外長度為 L 的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1 米。我們可以把馬路看成一個數軸,馬路的一端在數軸0 的位置,另一端在L 的位置;數軸上的每個整數點,即0,1,2,……,L,都種有一棵樹。
由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止點的座標都是整數,區域之間可能有重合的部分。現在要把這些區域中的樹(包括區域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走後,馬路上還有多少棵樹。

輸入資料

輸入的第一行有兩個整數L(1 <= L <= e9)和 M(1 <= M <=100),L 代表馬路的長度,M 代表區域的數目,L 和M 之間用一個空格隔開。接下來的M 行每行包含兩個不
同的整數,用一個空格隔開,表示一個區域的起始點和終止點的座標。

輸出要求

輸出包括一行,這一行只包含一個整數,表示馬路上剩餘的樹的數目。

輸入樣例

500 3
150 300
100 200
470 471

輸出樣例

298

解題

目前我還比較菜,資料結構沒學完。。所以要加倍努力啊!在做完之後看網上用“線段樹”去做的,然而還沒有接觸到┭┮﹏┭┮。
根據書上的解法用空間換時間,用陣列代表道路,雖然題目中說M屬於【1,100】,這樣做比較取巧,思路簡單,也不用處理重複的問題,適合於競賽這種短時間搶分環境,點個贊。
我最初分析了一下,然後寫出了以下第一種解答,思路很簡單,就是先減去再補上多減去的。
這種做法還有比較大提升的空間,因為有很多步驟可以減去。比如如果每次inside函式直接修改區間讓它們不重疊,這樣就不用先減再加上。實現的程式碼在最後。
然後。。開始翻了一個低階錯誤:0-500應該有501棵樹,不是501棵。0-500應該有501棵樹,不是501棵。0-500應該有501棵樹,不是501棵。重要的錯誤強調三遍,