主要思路:
一道簡單的貪心應用
從左至右覆蓋,r_covered記錄已覆蓋的區域的右端點(初始值為0)
將區間按照左端點排序(可以不用考慮右端點的順序)
在區間集合s中選出乙個右端點最大的(貪心原則)
集合s是左端點在r_covered左側(可相等)的區間集合
執行上述迴圈直至(二選一):
r_covered大於等於要求覆蓋區間的右端點
s為空集
若從1跳出迴圈則輸出所用區間數;從2跳出則輸出-1
選出最少的區間進行覆蓋,顯而易見我們要盡可能地選取長的區間。這裡的「長」是指「有效長」——即超出已覆蓋區域的長度,因為我們並不需要重疊的覆蓋。因此,我們對區間進行排序的依據便是區間的右端點。
c - 區間覆蓋
數軸上有 n (1<=n<=25000)個閉區間 [ai, bi]
選擇盡量少的區間覆蓋一條指定線段 [1, t](1<=t<=1,000,000)
覆蓋整點,即(1,2)+(3,4)可以覆蓋(1,4)。
不可能辦到輸出-1
input
第一行:n和t
第二行至n+1行: 每一行乙個閉區間。
output
選擇的區間的數目,不可能辦到輸出-1
sample input
3 10
1 73 6
6 10
sample output
2
#include
#include
#include
using
namespace std;
typedef
struct tag_interval
bool
operator
<
(const tag_interval& x)
const
}interval;
intmain()
}sort
(v.begin()
,v.end()
);while
(!v.
empty()
)if(v[i]
.l>r_covered+1)
break;}
if(flag)
else}if
(r_covered>=t)
printf
("%d\n"
,cnt)
;else
printf
("-1\n");
return0;
}
區間覆蓋(week3 作業C)
描述 數軸上有 n 個閉區間 ai,bi 選擇盡量少的區間覆蓋一條指定線段 1,t 不可能辦到輸出 1 輸入 注意,輸入包含多組測試資料,請處理到檔案結束 第一行 n和 第二行至n 1行 每一行乙個閉區間。輸出 選擇的區間的數目,不可能辦到輸出 1 樣例輸入 3 10 1 73 6 6 10 樣例輸...
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...
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 10 1 7...