過程總結
**
數軸上有 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
3101
7366
10
2
綜述
這個題和這週做的b題十分類似,也是將乙個區間組合排序,然後依次選擇;用到的演算法也是貪心演算法;
排序的準則是:按照按照右端點從頭到尾的公升序排列;
貪心的準則:
假定當前要覆蓋的區間是[begin,end];閉區間)
下一次選擇的區間滿足以下條件:
1)區間的末端點大於於等於end;
2)區間的左端點是滿足條件1中的最小的乙個
如果某次選擇沒有可用區間,並且要覆蓋的區間還未空,則退出返回-1,否則返回選擇的區間的個數;
過程step1:輸入
再輸入的時候,進行一遍篩選,將右端點小於begin或者左端點大於end的清除
for
(i =
0; i < n; i++
)
step2:選擇
第一步判斷
右端點最大的是否大於等於end
if
(qq.
top(
).b < t)
迴圈選擇:
while
(!qq.
empty()
) qq.
pop();
}else
}}
1、使用快速讀入scanf可以節省時間
2、貪心的準則有很多,需要找出並且證明乙個正確的
記錄:(剛開始錯誤的想法)
錯誤1:在多關鍵字排序的時候,排序的準則如下
1、右端點需要大於等於t
2、左端點小的排在前面
但是這樣是錯誤的,因為更新過一次之後,再選擇區間的時候,就會選擇出並不符合題意的區間
錯誤2:在錯誤1的基礎上優化,但是優化方式不對,導致超時
錯誤優化:每次選擇完區間都進行重新排序,右端點大於等於當前要覆蓋的區間的end,這樣複雜度在o(n^2*log)級別上,嚴重超時。
#include
#include
#include
using
namespace std;
int t;
int total =0;
struct p };
intmain()
int step =1;
//初步判斷
if(qq.
top(
).b < t)
int flag =
1000000
;while
(!qq.
empty()
) qq.
pop();
}else}}
//不行
std::cout <<
"-1"
<< endl;
}
Week3作業 C 區間覆蓋 貪心
數軸上有n 1 n 25000 個閉區間 ai,bi 選擇盡量少的區間覆蓋一條指定線段 1,t 1 t 1000000 覆蓋整點,即 1,2 3,4 可以覆蓋 1,4 不可能辦到輸出 1。輸入第一行為n和t,之後n行每行乙個閉區間。輸出選擇區間的數目,不可能辦到輸出 1。貪心準則 從已覆蓋的區間段中...
區間覆蓋(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...