题目链接:B-区间选点
题目描述:
数轴上有 n 个闭区间 [a_i, b_i]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)
Input:
第一行1个整数N(N<=100)
第2~N+1行,每行两个整数a,b(a,b<=100)
Output:
一个整数,代表选点的数目
Sample Input-1:
2
1 5
4 6
Sample Output-1:
1
Sample Input-2:
3
1 3
2 5
4 6
Sample Output-2:
2
思路:
贪心算法思想,首先对区间按照右端点的大小进行排序,然后从前往后依次查找各个区间,按照右端点的原则判断所查找区间中是否存在该点,如果存在,则继续往后执行,否则选择当前区间的右端点。上述策略可以保证右边界相同的区间,先选择区间短的那个。较短短区间的点被选择了,那么相同右边界的更大的区间肯定所选点。
总结:
本题开始进入贪心思想的算法解题中,从局部选择最优解,然后实现整体解的最优化。
代码:
#include<Iostream>
#include<algorithm>
using namespace std;
int min_int=1<<31;
struct node{
int a,b;
bool operator<(const node &no)const{
return b<no.b;
}
};
node k[100000];
int main(){
int n,a,b,count=0,MIN=min_int;
cin>>n;
for(int i=0;i<n;i++)
cin>>k[i].a>>k[i].b;
sort(k,k+n);
for(int i=0;i<n;i++)
if(k[i].a>MIN){
count++;
MIN=k[i].b;
}
cout<<count<<endl;
}