數軸上有 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還要大。
(注意是最大右端點+1,如[2,3][4,5]是可以的,只要求覆蓋整點)
區間選擇完畢,沒有覆蓋整條線段。
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...