某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置;數軸上的每個整數點,即0,1,2,…,l,都種有一棵樹。
由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止點的座標都是整數,區域之間可能有重合的部分。現在要把這些區域中的樹(包括區域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走後,馬路上還有多少棵樹。
輸入格式:
第一行有2個整數l(1≤l≤10000)和 m(1≤m≤100),l代表馬路的長度,m代表區域的數目,l和m之間用乙個空格隔開。
接下來的m行每行包含2個不同的整數,用乙個空格隔開,表示乙個區域的起始點和終止點的座標。
輸出格式:
1個整數,表示馬路上剩餘的樹的數目。
輸入輸出樣例
本題主要解決數的重複問題,因為給的資料是一段一段的,我的第一想法是利用二維陣列進行儲存,之後去重。但是實施過程中,發現存在同一段重複被多次減去,出現問題。於是,可以設定乙個陣列變數用於記錄樹是否被標記,可以避免被重複標記的情況。題目的本質便是對輸入資料的性質進行統計,存在兩種性質的資料,標記的和未標記的,於是可以使用雜湊法
wa**:
int nums[
20000][
2];int
main()
//去重
for(
int i =
0; i < num; i++
)else
//左入右出
if(nums[j][0
]>= nums[i][0
]&& nums[j][0
]<= nums[i][1
]&& nums[j][1
]> nums[i][1
])else
//左出右入
if(nums[j][0
]< nums[i][0
]&& nums[j][1
]>= nums[i][0
]&& nums[j][1
]<= nums[i][1
])else
if(nums[j][0
]]&&nums[j][1
]>nums[i][1
])}}
printf
("%d"
,total+
1-signtrees)
;return0;
}
上面這段**存在問題,假設num[1]=,num[2]=,num[3]=,則num[2]與num[1]去重一次,則num[3]與num[1]去重一次,最後num[3]與num[2]去重一次,其多去重了一次,解決這個問題就需要為每個位置設定乙個狀態變數,0表示未被標記,1表示被去除
#include
#include
int sign[
20000]=
;//初始化全為被標記
using namespace std;
intmain()
}int result =0;
//拿出未被標記的樹
for(
int k =
0; k <= total;
++k)
printf
("%d"
, result)
;return0;
}
還是雜湊的用法,輸入的數作為陣列的下標以用於統計數的性質 雜湊 P1047 校門外的樹
某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置 數軸上的每個整數點,即0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止...
P1047 校門外的樹
某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置 數軸上的每個整數點,即0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止...
P1047 校門外的樹
某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置 數軸上的每個整數點,即0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止...