數軸上有n(1<=n<=25000)個閉區間[ai,bi],選擇盡量少的區間覆蓋一條指定線段[1,t] (1<=t<=1000000)。覆蓋整點,即[1,2]+[3,4]可以覆蓋[1,4]。不可能辦到輸出-1。輸入第一行為n和t,之後n行每行乙個閉區間。輸出選擇區間的數目,不可能辦到輸出-1。
貪心準則:從已覆蓋的區間段中選出乙個a,它有最大的b,然後刪除最大b之前的區間。
首先讀入時如果區間在[1,t]之外,直接不記錄。讀完所有區間後應判斷是否沒有在[1,t]之間的區間。
之後對所有區間按a從小到大,b從大到小排序。
按照貪心準則,一開始沒選區間時,從a<=1的區間中找到最大b。如果沒有a<=1且b>1的區間,輸出-1。
此時已經新覆蓋了[lasta,lastb],需要從[lasta,lastb+1]中尋找乙個a,它有最大b。找到後應更改lasta與lastb。
注意到最後乙個區間時,應判斷是否選了新區間。
一道貪心題,貪心準則好想,但實現起來有些困難。如果簡單的找到最大b後刪除b之前的區間會tle。所以直接遍歷陣列,當找到最大b時,陣列索引之前的區間就是要刪除的區間,不用刪除。
同時應注意不能覆蓋的各種情況,少判斷一種都會wa。
#include
#include
#include
using
namespace std;
struct qujian};
bool
cmp(
const qujian&q1,
const qujian&q2)
}int
main()
if(v.
empty()
)//沒有在[1,t]的區間
int ans=0;
sort
(v.begin()
,v.end()
,cmp)
;//按a從小到大排序
//從a<=1的區間找到最大b
int index=0;
//vector下標
int maxb=1;
for(
;index
size()
;index++)
ans++
;//覆蓋了[1,maxb]
if(maxb==1)
//沒有a<=1&&b>1的區間
int lasta=
1,lastb=maxb;
//此時已經新覆蓋了[lasta,lastb],需要從[lasta,lastb+1]中尋找乙個a,它有maxb
for(
;index
size()
;index++
)else
break;}
if(index==v.
size()
-1)//最後乙個,判斷是否選了新區間
//沒選,什麼也不做(此時覆蓋不了[1,t]) }}
//判斷是否覆蓋了[1,t]
if(lastb>=t) cout<
else cout<
<
}
區間覆蓋(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...