找点
时间限制: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; } }