找點
時間限制:2000 ms | 記憶體限制:65535 KB
難度:2
- 描述
-
上數學課時,老師給了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 A
本題貪心演算法區間選點,主要考慮題目中是閉區間,故像區間[1,2]和區間[2,3]只需要一個點,注意要不斷跟新先前的區間,特別像
[1,5]
[2,3]
[6,7]
其中[6,7]先前區間為[2,3],即為以前區間的交集#include <iostream> #include <vector> #include <utility> #include <algorithm> using namespace std; typedef pair<int,int> Segment; bool cmp(const Segment& a, const Segment& b){ if(a.first!=b.first) return a.first < b.first; else return a.second < b.second; } int main(){ int n; while(cin >>n ){ vector<Segment> segments(n); for(int i = 0 ; i < n; ++i){ int x1,x2; cin >>x1 >>x2; segments[i] = Segment(x1,x2); } sort(segments.begin(),segments.end(),cmp); int res = 1; Segment prev = segments[0]; for(int i = 1; i < n; ++ i){ if(segments[i].first> prev.second){ res++; prev = segments[i]; }else if(segments[i].second < prev.second){ prev.second = segments[i].second; } } cout<<res<<endl; } }