貪心 區間選點問題

2021-10-04 04:57:48 字數 1045 閱讀 5284

數軸上有 n 個閉區間 [a_i, b_i]。取盡量少的點,使得每個區間內都至少有乙個點(不同區間內含的點可以是同乙個)

第一行1個整數n(n<=100)

第2~n+1行,每行兩個整數a,b(a,b<=100)

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

input

21546

output

1input

3132546

output

2

首先從正常的思路來看,由於要選擇最少的點,並且兩個區間可以包含的是同乙個點,那麼如果有兩個區間,則應該盡量選擇第乙個區間靠右的店,第二個區間中靠左的點,並且如果這兩個區間有交集的話則可以只選擇乙個點,達到目的。

因此從貪心的角度來講,這個題可以利用多關鍵字排序的方法,將所有區間按照右端點從小到大排序,右端點相等的區間可以按照左端點從小到大排序。然後先選取第乙個區間的右端點,接下來比較該右端點是否在下乙個區間內,若在則直接跳到下乙個區間,若不在則需要從下乙個區間中選取右端點作為下乙個點,重複上述操作,直到遍歷結束所有區間。

在這裡使用dfs的方法實現以上思路。

#include

#include

using

namespace std;

struct region

;int n;

int number=0;

region m[

100]

;bool

cmp(

struct region x,

struct region y)

void

select

(int i,

int score,region *num)

//i記錄陣列第幾個,num記錄選了的個數

else}}

intmain()

貪心演算法的具體證明很難,但大多都可以根據直覺有乙個大致的判斷,然後可以利用測試資料進行對應的修改完善,得到正確的貪心策略。因此,做題時一定不要直接跳到題目裡面,而應該先從大局考慮問題的解決方法。

貪心 區間選點問題

主要採用的就是貪心的思想,首先以每一段的右端點為判斷依據,通過重定義排序規則,使得排序規則是以右端點的大小來排序,然後通過遍歷整個陣列,如果左端點小於當前指定標誌位端點,說明這段是在點的內部範圍內的,就忽略,如果不是在當前指定標誌位端點,那麼就記錄端點數加一,同時更新標誌位端點為當前右端點。incl...

貪心問題 區間選點

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

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

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