Week3 作業 C 區間覆蓋 貪心演算法

2021-10-04 04:16:19 字數 1727 閱讀 4188

過程總結

**

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