题意:
数轴上有n个闭区间,在数轴上选取尽量少的点,使得每个区间上都有一个点,其中一个点可以覆盖多个区间。
思路:
将各个点用结构体记录下来,分别记录下左右边界。不妨设左端点为a,右端点为b。对这些点进行排序,然后将区间按b 从小到大排序(b 相同时a 从大到小排序),然后从前往后进行选点,点为选择前一个区间的右端点,然后再不断取出后面的区间,看看前面选择的点是否在区间内,若小于该区间的左端点,即不在区间内,即选取该区间的右端点作为下一个点,循环下去,直到区间选完。
总结:
主要是点的选取问题,即先对区间进行排序处理,然后从最左端开始,依次选点。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
struct P{
int a; //左右端点
int b;
bool operator<(const P& p){
if(b!=p.b ) return b<p.b;
if(a!=p.a) return a>p.a;
}
};
int main(){
int n;
cin>>n; //区间个数
P p[n]={0};
for(int i=0; i<n; i++){
cin>>p[i].a>>p[i].b;
}
sort(p,p+n); //进行排序
int count=0; //记录点数
int m=p[0].b; //当前点的位置
count++;
for(int i=1; i<n; i++){ //遍历区间
if(m<p[i].a){ //若点在区间外,则重新选点
count++;
m=p[i].b;
}
}
cout<<count<<endl;
return 0;
}
原题: