B 區間選點

2021-10-03 16:50:59 字數 1484 閱讀 7808

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

input

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

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

output

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

2

1 54 6

output

1
input

3

1 32 5

4 6

output

2
首先定義區間結構體,過載<,以及建構函式。

本題核心思路是:先把所有區間按照第一關鍵字b(區間終點)公升序排列,再按照第二關鍵字a(區間起點)降序排列,第乙個選點是排序後第乙個區間的右端點,之後選點依據是最新的乙個選點,是否被新的區間所包含,若不被包含,則將此點選上,更新選點總數和最新選點,以此類推,直到所有區間都被遍歷一次。

#include

#include

#include

using

namespace std;

struct period

//公升序排序

if(a!=p.a)

//降序排序

}period()

period

(int aa,

int bb)

//建構函式過載};

intmain()

//全部區間讀入

sort

(all.

begin()

,all.

end())

;//多關鍵字排序

//開始選點

int latest=all[0]

.b;//選的第乙個點必是第乙個區間的右端點

int result=1;

//儲存需要的點數目

for(

int i=

1;icout<"\n"

; all.

clear()

;//非常重要,一定要清空陣列

}return0;

}

所有區間排序時,不一定非要按照給出的方式排序,只要後續演算法匹配即可。

sort函式表示排序的起點、終點時,begin()、end()是比較不容易出錯的,其他也可以取位址、指標加減指定起點和終點,注意sort左閉右開!

**中有不嚴謹處,即過載《時,未包含a、b均相等時的情況,此時該返回什麼未指明。

過載《排序的方法,比cmp更直觀一些。

B 區間選點

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

B 區間選點 貪心演算法

數軸上有 n 個閉區間 a i,b i 取盡量少的點,使得每個區間內都至少有乙個點,輸出選點的數目。樣例輸入輸出 定義乙個結構體表示區間,讀入資料後,進行多關鍵字排序 第一為右區間小的在前,第二為左區間大的在前 從開始選擇第乙個區間的右端點point,向後迴圈,若point在該區間內,則繼續迴圈,直...

week 3 B 區間選點

數軸上有 n 個閉區間 a i,b i 取盡量少的點,使得每個區間內都至少有乙個點 不同區間內含的點可以是同乙個 第一行1個整數n n 100 第2 n 1行,每行兩個整數a,b a,b 100 乙個整數,代表選點的數目 21 5 4 63 1 32 5 4 6該題的貪心策略是 選取區間的最後乙個點...