數軸上有 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 這裡建立乙個小根堆,小根堆的最頂部是最...