上數學課時,老師給了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...