Week3作業 C 區間覆蓋 貪心

2021-10-03 15:34:26 字數 1617 閱讀 6337

數軸上有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...