本題給定兩個整數n和t,n表示接下來會輸入n段區間,t表示需要覆蓋的區間為[1,t]。題目要求利用輸入的n段區間來覆蓋[1,t]段,且選取數目最小。最終需要輸出最小段數,若給出的區間無法完全覆蓋[1,t],則輸出-1.
本題需要用貪心的思路來求解。首先根據每段區間左端點由小到大排序,之後從第一段開始選取,若第一段起點大於1,則直接輸出-1.能夠覆蓋起點,則繼續從之後的區間中遍歷左端點小於已確定區間右端點的區間,然後每次更新的maxlen表示新區間能覆蓋的長度,取該長度最大的區間即為下一段確定的區間。這裡要注意形如[1,2],[3,4]是可以覆蓋區間[1,4]的。持續上述操作直到結束即可。中途如果遇到某次maxlen的值在遍歷後仍為初始的0,說明中間某段無法被覆蓋,輸出-1.對於判斷結束的條件,可以確定乙個len,該變數用來記錄每次已覆蓋的區間,即每次確定maxlen後,len更新為len+maxlen。
#include #include using namespace std;
struct node
a[100005];
bool cmp(node &x,node &y)
int main()
sort(a,a+n,cmp);
cnt=0;
int len=0,maxlen,tmp;
int newbegin=0;
i=0;
while(len < t - 1)
else
if(tmp > maxlen)
}else
}if(maxlen==0)
len += maxlen;
cnt++;
newbegin = a[j].r;
} cout << cnt << endl;
} return 0;
} ```
貪心 區間覆蓋問題
區間覆蓋問題 time limit 1000ms memory limit 65536kb submit statistic discuss problem description 設x1 x2 xn 是實直線上的n 個點。用固定長度的閉區間覆蓋這n 個點,至少需要多少個這樣的固定長度閉區間?對於給...
演算法 求解區間覆蓋問題
求解區間覆蓋問題 20分 題目內容 設x1,x2,xn是實直線上的n個點。用固定長度的閉區間覆蓋這n個點,至少需要多少個這樣的固定長度閉區間?設計求解此問題的有效演算法。對於給定的實直線上的n個點和閉區間的長度k,程式設計計算覆蓋點集的最少區間數。輸入格式 輸入資料的第一行有2個正整數n和k,表示有...
貪心法 區間覆蓋問題
區間覆蓋問題。數軸上有n個閉區間 a i,bi 選擇盡量少的區間覆蓋一條指定線段 s t 先進行預處理,將不包含 s t 的區間都去掉,然後再按左區間從小到大排序。如果最小區間的左區間大於 s 的話,則無解。選取包含 s的右區間最大的區間,該區間的右區間仍然小於下乙個區間的左區間,則無解。按照這樣的...