程序设计思维与实践 Week3 作业 B-区间选点

题目链接: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;
}
发布了24 篇原创文章 · 获赞 0 · 访问量 517

猜你喜欢

转载自blog.csdn.net/qq_43666020/article/details/104904603