數軸上有 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該題的貪心策略是 選取區間的最後乙個點...