Week3 區間選點 區域性貪心

2021-10-03 14:19:30 字數 1695 閱讀 9885

題目內容

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

輸入格式

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

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

輸出格式

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

樣例

input

21 5

4 6

output

1

input

31 3

2 54 6

output

2

解題思路本題採取區域性貪心的策略。

對於輸入完成之後的各個區間,對其進行排序:

接下來的部分用乙個例子來解釋(圖中已經按照上述規則排序好了):

我們先選擇區間一的end點,此時總點數count=1。不難發現,當第乙個點選在這的時候,所有與其end點相同的區間都一定會有點了(因為我們已經排序過了),把這裡設定成curlast點。

接下來看之後的區間,在這時,如果遇到的區間的start點在我們當前的curlast之前,那麼這個區間就可以跳過不管,因為已經有乙個點在它的範圍內了。(圖中為區間2和區間3,這時候我們的curlast點依舊在紅色處)

繼續往下看,我們發現當我們遇到區間6的時候,其start點就在curlast之後了,也就是說,curlast點已經不能滿足「區間6裡有乙個點了」,因此我們需要選第二個點,我們依舊選擇end點。此時count=2,curlast在藍色位置。

繼續往下看,區間7的start點在curlast點之前,跳過。

區間8的start點在curlast點之後,所以我們同前兩次的操作,更新curlast。現在count=3,curlast在綠色處。

我們發現已經遍歷完了所有的區間,**結束,結果為3;

**

#include

#include

#include

using

namespace std;

struct timecell};

vectortimecell;

bool

cmp(

const timecell& a,

const timecell& b)

intmain()

sort

(timecell.

begin()

, timecell.

end(

), cmp)

;int curlast = timecell[0]

.end;

counter++

;for

(int i =

1; i < timecell.

size()

; i++)}

cout << counter << endl;

return0;

}

week3 區間選點

title 數軸上有 n 個閉區間 x i,y i 取盡量少的點,使得每個區間內都至少有乙個點 不同區間內含的點可以是同乙個 input 第一行1個整數n n 100 第2 n 1行,每行兩個整數x,y x,y 100 output 乙個整數,代表選點的數目。分析 總結 貪心準則直接決定了貪心演算法...

Week 3 區間選點

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

Week3 作業B 區間選點 貪心

數軸上有n個閉區間 ai,bi 選盡量少的點,使得每個區間內都至少有乙個點 不同區間內的點可以是同乙個 貪心策略 按照b公升序a降序將區間排序,從前向後遍歷,當遇到還沒有點加入集合的區間時,加入該區間的右端點。證明 對於有區間包含的情況,假設小區間為 x,y 大區間為 m,n 顯然x m y下面排除...