week3 作業C 區間覆蓋

2021-10-03 22:40:07 字數 1629 閱讀 5961

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

input3 10

1 73 6

6 10

output

2

要想用最少的區間覆蓋線段,那肯定得選覆蓋範圍廣的區間。

除掉那些與所給線段完全不重疊的區間,將剩下區間先按左端點公升序、右端點公升序排列,將[1,第乙個區間右端點]看做已覆蓋部分,在區間的左端點都與已覆蓋部分連續時,選擇右端點最大的,當區間的左端點比已覆蓋部分大1時,將已覆蓋範圍置為[當前最大右端點,當前最大右端點]繼續上述操作,直至滿足條件或不可能實現。

幾個不可能實現的情況:

切除無關部分,排好序後的第乙個區間左端點大於1。

在選擇過程**現,區間左端點比當前的最大右端點+1還要大。

(注意是最大右端點+1,如[2,3][4,5]是可以的,只要求覆蓋整點)

區間選擇完畢,沒有覆蓋整條線段。

1.此題與區間選點一樣,還是貪心演算法的思想,要注意的是題中只要求覆蓋整點,所以在進行比較時要注意。

2.此外,還要在輸入時就將與線段無關的部分拋棄,將這些部分納入判斷中是沒有必要的.

3.這道題輸入資料很多,應該用scanf而不是cin。

#include

#include

#include

using

namespace std;

struct point};

intmain()

}sort

(p,p+n)

;//將區間進行排序

if(p[0]

.a>1)

//不可能

point chose;

chose.a=

1;chose.b=p[0]

.b;int count=0;

//點的數量

bool flag=

false

;for

(int i=

0;i<=n;i++

)//以下為不可能辦到情況

if(i==n)

break;if

(chose.b

.a -1)

break

;//中間出現不能被覆蓋的部分

if(chose.b>=p[i]

.b)continue

;//該區間已被包含在覆蓋範圍內

else}}

if(flag)

else

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...