问题描述
数轴上有 n 个闭区间 [a_i, b_i]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)
Input
第一行1个整数N(N<=100)
第2~N+1行,每行两个整数a,b(a,b<=100)
Output
一个整数,代表选点的数目
Exmaples
- Input
2
1 5
4 6
Output
1 - Input
3
1 3
2 5
4 6
Output
2
问题分析
每个区间都至少选一个点,贪心算法,区间按 b 从小到大排序,第一个区间取最后一个点,再依次按b增大顺序处理,如果上次选点不在该区间范围内,则选该区间最后一个点,即选区间的右端点b,选点数目加一,一直进行上述步骤直到处理完所有区间。证明过程略(可以用反证法)。
#include<iostream>
#include<algorithm>
using namespace std;
struct T
{
int x,y;
};
bool cmp(T a,T b)
{
return a.y<b.y;
}
int main()
{
int n,sum=0,t=-1;
T a[110];
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i].x>>a[i].y;
sort(a,a+n,cmp);//排序
for(int i=0;i<n;i++)
if(t<a[i].x || t>a[i].y)
{
t=a[i].y;
sum++;
}
cout<<sum;
return 0;
}