描述
數軸上有 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 73 6
6 10
樣例輸出
2提示
這道題輸入資料很多,請用scanf而不是cin
解題思路:
先進行一次預處理,把每個區間在[1, t] 外的部分都應該預先被切掉,因為它們的存在是毫無意義的(不過我忘弄了,請忽略)。用t陣列表示左端點ai開始的區間的右端點最大值。選擇此區間[ai, bi] 後,新的起點應 該設定為bi,如此找下去。直到右端點到達為止。中途如果新的maxn小於等於上一次區間的右端點,則終止迴圈。
#include
#include
#include
using
namespace std;
int t[
1000005];
//t[i]表示以i開始的所有的線段中右端點最大的值
intmain()
int len=
0,las=
0,s=0;
bool flag=
false
;//flag標記量變為1則輸出-1,w為0則輸出s;s:貪心求解得出的最少區間數;len左端點,las右端點;
while(1
)if(maxn<=las)
s++;
len=x;
las=maxn;
if(las==t)
break;}
if(flag)
printf
("-1\n");
else
printf
("%d\n"
,s);
}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。3 10 1 7...
week3 作業C 區間覆蓋
數軸上有 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 選擇的區間的數目,不可能辦到...