貪心問題 區間選點以及區間覆蓋

2021-10-04 03:53:26 字數 1777 閱讀 4347

乙個整數,代表選點的數目

215

46

1
313

2546

2
將區間按照右端點降序排序,如果右端點一樣的話,則左端點降序排序。

排序完成後,先選擇第乙個區間的右端點,判斷該點與下乙個區間的關係,找到下乙個不包含該點的區間,再次選擇下乙個區間的右端點,以此類推,直到迴圈判斷完所有的區間,得到最終的點數。

#include

#include

using

namespace std;

struct section};

intmain()

else

} cout<

delete a;

return0;

}

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

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

將n個區間根據左端點從小到大排序,每次更新選取tmp為左端點最長的區間,

定義了乙個bool變數flag用於判斷區間每一步區間是否可以找到乙個合適的,並且如果每一步都是合適的加之最後區間右端點tmp>=題目所給的右端點。就是區間可以全部覆蓋

再者區間是從1開始的。

關鍵所在一定要理解(1,2),(3,4)算覆蓋了(1,4)

bool flag=

false

;while

(a[i]

.a<=temp+

1&& i<=n)

//之所以+1,題目中(1,2),(3,4)算覆蓋了(1,4)

i++;}

#include

#include

using

namespace std;

const

int maxn=

25000+5

;struct section

}a[maxn]

;int

main()

i++;}

if(!flag)

break

;//找不到可以利用的區間,覆蓋失敗,直接跳出

ans++

; i--

;//while的最後一次有i++

temp=a[id]

.b;//將左端點賦值為上乙個選定區間的右側

if(temp>=t)

break

;//已經找到滿足題意足夠的區間,直接跳出

tempmax=0;

}if(flag==

0||temp

cout<<

"-1"

<

else

cout<

return0;

}

區間貪心問題小結(區間選點,區間覆蓋,區間選取)

貪心演算法 思想 什麼是貪心演算法,什麼算得上是貪心 貪心演算法 又稱貪婪演算法 是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,只做出在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性...

區間問題 區間選點 區間問題 貪心

玄學的貪心問題,一般全憑直覺。貪心問題沒有固定討論,沒有模板,見多了就好了,證明想法的正確性是很困難的,大多採用反證法。905.區間選點 貪心思路 證明 時間複雜度 o n logn o nlogn o nlog n include include using namespace std const...

貪心 區間選點問題

數軸上有 n 個閉區間 a i,b i 取盡量少的點,使得每個區間內都至少有乙個點 不同區間內含的點可以是同乙個 第一行1個整數n n 100 第2 n 1行,每行兩個整數a,b a,b 100 乙個整數,代表選點的數目 input 21546 output 1input 3132546 outpu...