題目內容
數軸上有 n 個閉區間 [a_i, b_i]。取盡量少的點,使得每個區間內都至少有乙個點(不同區間內含的點可以是同乙個)
輸入格式
第一行1個整數n(n<=100)
第2~n+1行,每行兩個整數a,b(a,b<=100)
輸出格式
乙個整數,代表選點的數目
樣例
input21 5
4 6
output1
input31 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下面排除...