題目891 找點

2021-08-08 14:29:57 字數 1146 閱讀 5474

上數學課時,老師給了lyh一些閉區間,讓他取盡量少的點,使得每個閉區間內至少有乙個點。但是這幾天lyh太忙了,你們幫幫他嗎?

多組測試資料。

每組資料先輸入乙個n,表示有n個閉區間(n≤100)。

接下來n行,每行輸入兩個數a,b(0≤a≤b≤100),表示區間的兩個端點。

輸出乙個整數,表示最少需要找幾個點。

4 1 5

2 4

1 4

2 3

3 1 2

3 4

5 6

1 2 2

1 3

1貪心演算法,首先將區間按左邊界進行從小到大進行排序。使用臨時變數s記錄當前區間的左邊界,臨時變數e記錄當前區間的右邊界,ans記錄至少需要多少點。

迴圈遍歷一次:

當當前區間的左邊界小於e時,說明該區間與上區間有交集,故可以選擇乙個點使得既在該區間內同時也在上區間內,更新上區間s為當前區間的左邊界,e為min(上區間的右邊界,當前區間的右邊界);

當當前區間的左邊界大於e時,說明該區間與上區間沒有交集,故得新增乙個點到當前區間,更新s和e,其中s為當前區間的左邊界,e更新為當前區間的由邊界。(因為已經排序過,故後面的區間更不會與上一次的區間有交集,因為當前區間與上次區間無交集)。

#include 

#include

#include

using

namespace

std;

struct mydata

;int less_cmp(const mydata &x,const mydata &y)

int main()

//按左邊界進行排序

sort(vec.begin(),vec.end(),less_cmp);

int s, e;//s記錄當前區間的左邊界,e記錄當前區間的右邊界

s = vec[0].s, e = vec[0].e;

ans++;

for (int i = 1;i < n;i++)

else

//無交集,故ans++,更新s和e

}cout

<< ans << endl;

}return

0;}

由源**可知,時間複雜度為o(n)。

nyoj 891 找點 貪心

時間限制 2000 ms 記憶體限制 65535 kb 難度 2 描述 上數學課時,老師給了 lyh一些閉區間,讓他取盡量少的點,使得每個閉區間內至少有乙個點。但是這幾天 lyh太忙了,你們幫幫他嗎?輸入 多組測試資料。每組資料先輸入乙個n,表示有n個閉區間 n 100 接下來n行,每行輸入兩個數a...

nyoj 891 找點(貪心)

時間限制 2000 ms 記憶體限制 65535 kb 難度 2 描述 上數學課時,老師給了 lyh一些閉區間,讓他取盡量少的點,使得每個閉區間內至少有乙個點。但是這幾天 lyh太忙了,你們幫幫他嗎?輸入多組測試資料。每組資料先輸入乙個n,表示有n個閉區間 n 100 接下來n行,每行輸入兩個數a,...

nyoj891找點 區間上的貪心

時間限制 2000 ms 記憶體限制 65535 kb 難度 2 描述 上數學課時,老師給了 lyh一些閉區間,讓他取盡量少的點,使得每個閉區間內至少有乙個點。但是這幾天 lyh太忙了,你們幫幫他嗎?輸入 多組測試資料。每組資料先輸入乙個n,表示有n個閉區間 n 100 接下來n行,每行輸入兩個數a...