區間覆蓋 最少能覆蓋區間的區間數(貪心)

2021-10-03 12:47:48 字數 2626 閱讀 9893

完整**

部分易錯資料

大表哥分配 n (1 <= n <= 25,000) 只中的一些奶牛在牛棚附近做些清潔。 他總是要讓至少乙隻牛做清潔。他把一天分成t段(1 <= t <= 1,000,000), 第一段是1,最後一段是t

每只奶牛只在一些時間段有空。奶牛如果選擇某一段時間,則必須完成整段時間的工作

你的任務是幫助fj安排一些奶牛,使每段時間至少有乙隻奶牛被安排來做這件事。並且奶牛數應盡可能小。如果不可能辦到,輸出-1

注意,輸入包含多組測試資料,請處理到檔案結束

第一行:n和t

第二行至n+1行: 每一行乙個閉區間,表示奶牛工作的開始時間和結束時間。

選擇的區間的數目,不可能辦到輸出-1

3101

7366

10

2
這道題輸入資料很多,請用scanf而不是cin

問題分析

首先分析這是乙個什麼問題,題目要求選擇最少的區間來覆蓋[1,

t]

[1,t]

[1,t

]這個區間,這個題可以使用區間dp+線段樹來做(大材小用,區間dp+線段樹可以解決每個區間花費不同的區間最小花費問題,用在這裡自然可以),但是更好的演算法應該還是貪心。

注意坑點

[ 1,

3]

[1,3]

[1,3]和[4,

10]

[4,10]

[4,10]

是可以覆蓋[1,

10]

[1,10]

[1,10]

的。貪心策略

我們先考慮按照區間的左端點從小到大排序,為什麼這麼排呢?因為我們要讓奶牛覆蓋完整的區間,那麼肯定先選能夠在1節點工作的奶牛,假設這個奶牛工作的區間是[1,

b1

][1,b_1]

[1,b1​

],那麼下乙個要選的奶牛,就是從b

1b_1

b1​開始,工作時間最久的(假設其工作區間是[a2

,b2]

[a_2,b_2]

[a2​,b

2​]),也就是需要a

2<=b

1+

1a_2<=b_1+1

a2​<=b

1​+1

(+1是因為我們上面提到的坑點)。由於我們開始是按照區間的左端點從小到大排序,那麼從迴圈開始,後面連續一段應該都是a

i

a_iai

​​的(如果沒有,設個標記直接跳出,因為沒有辦法完全覆蓋了),然後用while處理找工作時間最長的即可。更多詳細資訊見下方**。

//#pragma gcc optimize(2)//比賽禁止使用!

//#pragma g++ optimize(2)

//#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

25000+1

;struct interval

len[maxn]

;int n,t,ans;

bool

comp

(interval a,interval b)

//a小的排在前面

intgetint()

while

(ch>=

'0'&& ch<=

'9')

return x*s;

}int

main()

i++;}

if(!flag)

break

;//找不到可以利用的區間,覆蓋失敗,直接跳出

ans++

; i--

;//如果進入了迴圈,最後多加了一次

temp=len[id]

.b;//選中的節點取從上乙個節點開始工作時間最長的

if(temp>=t)

break

;//已經找到足夠的奶牛,直接跳出

tempmax=int_min;}if

(!flag || tempprintf

("-1\n");

else

printf

("%d\n"

,ans)

;return0;

}

input1
4

10021

5050811

2080

99

output1
-

1

input2
3101

3467

10

output2
3
input3
3102

4376

10

output3
-

1

最大不相交區間數 最少區間數覆蓋問題 貪心思想

最大不相交區間數的一道題是hdu2037 題目給出n個區間,問最多有多少個區間沒有重疊,只需要對區間右端點進行排序就行,因為乙個節目結束得早的話就會為其他節目留下更多的時間,如果選擇對節目的開始時間進行排序的話就會導致有乙個節目遲遲不結束使得其他節目又沒法開始的現象。右端點最小的第乙個區間時一定要選...

區間覆蓋問題

time limit 1000ms memory limit 65536k 用i來表示x座標軸上座標為 i 1,i 的長度為1的區間,並給出n 1 m 200 個不同的整數,表示n個這樣的區間。現在要求畫m條線段覆蓋住所有的區間,條件是 每條線段可以任意長,但是要求所畫線段的長度之和最小,並且線段的...

區間覆蓋問題

time limit 1000ms memory limit 65536k 用i來表示x座標軸上座標為 i 1,i 的長度為1的區間,並給出n 1 m 200 個不同的整數,表示n個這樣的區間。現在要求畫m條線段覆蓋住所有的區間,條件是 每條線段可以任意長,但是要求所畫線段的長度之和最小,並且線段的...