雜湊 P1047 校門外的樹

2021-09-01 19:38:50 字數 1869 閱讀 8712

某校大門外長度為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,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止...