一、问题描述
数轴上有 n 个闭区间 [a_i, b_i]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)
输入:
第一行1个整数N(N<=100)
第2~N+1行,每行两个整数a,b(a,b<=100)
输出:
一个整数,代表选点的数目
举例:
Input
2
1 5
4 6
Output
1
Input
3
1 3
2 5
4 6
Output
2
二、思路概述
使用贪心算法的思想来处理。
先将每个区间按照先按b升序,再按a降序进行排序。
num作为计数器,从第一个区间开始判断,最后一个点作为count,再看下一个区间,如果count属于如果下一个区间则继续往下,如果不属于,则更新count为此时区间的右端点,而且num++。
三、注意点
1.要对break,return和continue的用法比较熟悉,break是结束整个循环,如for和while,continue是进行下面的代码。他们的用处各不相同,在使用的时候要注意。
四、完整代码
#include<iostream>
#include<algorithm>
using namespace std;
int n;//n个区间
int sum;
struct Inter
{
int a,b;//左右端点
};
int cmp(Inter x,Inter y)
{
if(x.b!=y.b)return x.b<y.b;//先按b升序
return x.a>y.a;//再按a降序
}
void Csum(Inter *ter)
{
//计数,看需要几个点
int count=ter[0].b;
sum=1;
for(int i=1;i<n;i++)
{
if(count>=ter[i].a&&count<=ter[i].b)continue;
else{count=ter[i].b;sum=sum+1;}
}
}
int main()
{
cin>>n;
Inter *ter=new Inter[n];//数组用来存储n个区间
sum=0;
for(int i=0;i<n;i++)
cin>>ter[i].a>>ter[i].b;
sort(ter,ter+n,cmp);//排序
Csum(ter);
cout<<sum<<endl;
return 0;
}