問題描述
某校大門外長度為 L 的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是 1 米。我們 可以把馬路看成一個數軸,馬路的一端在數軸 0 的位置,另一端在 L 的位置;數軸上的每 個整數點,即 0,1,2,......,L,都種有一棵樹。 由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已 知任一區域的起始點和終止點的坐標都是整數,區域之間可能有重合的部分。現在要把這些 區域中的樹(包括區域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走後,馬路上 還有多少棵樹。
輸入數據
輸入的第一行有兩個整數 L(1 <= L <= 10000)和 M(1 <= M <= 100),L 代表馬路 的長度,M 代表區域的數目,L 和 M 之間用一個空格隔開。接下來的 M 行每行包含兩個不 同的整數,用一個空格隔開,表示一個區域的起始點和終止點的坐標。
輸出要求 輸出包括一行,這一行只包含一個整數,表示馬路上剩余的樹的數目。 輸入樣例
500 3
150 300
100 200
470 471
輸出樣例 298
解法分析:
一上來第一反應是去求集合,做了個二維數組,然後被卡在合並集合上。
但是看題目的constrains,會發現L最大並不大。所以衍生出了一個簡單方法,初始設值都為1.每次section范圍置0,多次section重合置0不會影響。所以最後題目的c++解法如下:
#include <iostream> #include <vector> #include <numeric> using namespace std; int compare(vector<int>a,vector<int>b) { return a[0]<b[0]; } int main() { int l,m; cin>>l>>m; int *trees=new int[l+1]; //fill the array with 1 fill_n(trees,l+1,1); int start,end; for(int i=0;i<m;i++) { cin>>start>>end; for(int j=start;j<=end;j++) { trees[j]=0; } } //sum of trees cout<<accumulate(trees,trees+l+1,0); delete []trees; }