C 區間覆蓋 貪心演算法

2021-10-03 14:23:38 字數 1475 閱讀 5469

數軸上有 n個閉區間 [ai, bi],選擇盡量少的區間覆蓋一條指定線段 [1, t],不可能辦到輸出-1。

定義乙個結構體代表區間,在讀入資料後,對資料進行多關鍵字排序(第一是左端點小的在前,第二是右端點大的在前)。對資料進行過濾,左端點相同的區間只保留區間長度最大的,如果當前區間被之前保留的區間完全包含則去掉。

如果陣列中第乙個區間不包含1即不可能包含[1,t],直接返回-1。

<1>相等,表明當前區間應該被選,更新point,繼續比較和迴圈。

<2>區間端點的左值較大,看上乙個區間(該區間左端點的值一定小於等於point)。如果上乙個區間的右端點值與當前區間的左端點值相差大於1,即不相接,說明所給的區間至少不能覆蓋 [上一區間右端點,當前區間左端點] ,返回-1;

否則,上乙個區間符合條件,應該被選,更新point,繼續比較和迴圈。

<3>point較大,如果當前區間已經是最後乙個區間,選擇當前區間,如果選上之後還是不能覆蓋t點,則返回-1,如果能,則迴圈結束。若不是最後乙個區間,則接著迴圈判斷下乙個區間。

過濾區間是有必要的,沒有用的區間會造成複雜的情況,並且增大時間代價。

在迴圈過程中,需要考慮到所有的情況,最好是根據某些值進行分類以免造成冗餘或者缺失。

#include

#include

using

namespace std;

struct section

;bool

com(section a, section b)

//左端點小的在前,右端點大的在前

intmain()

section* only =

new section[n]

;int left = sec[0]

.left;

int right = sec[0]

.right;

only[0]

= sec[0]

;int r =1;

for(

int i =

1; i < n; i++

)//如果左區間相同保留右區間最大的乙個,乙個區間被另乙個區間包含時不加入

}int sum =0;

//記錄已選擇的區間數目

int point =1;

//[point,t]還沒覆蓋

int i =0;

//標記陣列位置

while

(point <= t)

//未覆蓋t

else

if(only[i]

.left > point)

//選擇only[i-1]

sum++

; point = only[i -1]

.right +1;

}else

break;}

else

i++;}

}printf

("%d"

, sum);

}

貪心演算法 區間覆蓋

數軸上有 n 1 n 25000 個閉區間 ai,bi 選擇盡量少的區間覆蓋一條指定線段 1,t 1 t 1,000,000 覆蓋整點,即 1,2 3,4 可以覆蓋 1,4 不可能辦到輸出 1。第一行 n和t 第二行至n 1行 每一行乙個閉區間。輸出選擇的區間的數目,不可能辦到輸出 1 input ...

Week3 作業 C 區間覆蓋 貪心演算法

過程總結 數軸上有 n 1 n 25000 個閉區間 ai,bi 選擇盡量少的區間覆蓋一條指定線段 1,t 1 t 1,000,000 覆蓋整點,即 1,2 3,4 可以覆蓋 1,4 不可能辦到輸出 1。第一行 n和t 第二行至n 1行 每一行乙個閉區間。輸出選擇的區間的數目,不可能辦到輸出 1 3...

貪心演算法 區間合併以及覆蓋問題

1.當前區間的左端點比最小組右端點小,說明兩區間有交集,就要開乙個新的組。2.當前區間的左端點比最小組右端點大,說明兩區間沒有交集,因此放入該組,並且將該組的右端點更新成加入區間的右端點。這裡將所有區間按左端點從小到大排序 sort range range n 這裡建立乙個小根堆,小根堆的最頂部是最...