B - 区间选点(贪心算法)

区间选点

  • 题意
    数轴上有 n 个闭区间 [a_i, b_i]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个

  • 输入输出
    Input
    第一行1个整数N(N<=100),第2~N+1行,每行两个整数a,b(a,b<=100)
    Output
    一个整数,代表选点的数目
    在这里插入图片描述

  • 解题思路:由于要选尽量少的点满足所有区间,所以重点是要判断有没有重叠部分。自定义结构体node记录区间的两个端点,用cmp函数将所有区间的按照小的端点升序排列,从第一个区间开始依次向后比较,如果前一个区间的y小于后一个区间的x,即没有重叠部分时,计数器加一。如果有重叠部分,则将后一个区间的y更新为当前两个区间中较大的y,继续向后比较。最后输出计数器的值,就是最小的点数。

  • 代码实现

#include <iostream>
#include <algorithm>
using namespace std;

struct node
{
	int x,y;
}a[1000];

//升序 
bool cmp(node a,node b)
{
	return a.x<b.x;
}

int main()
{
	int n;
	while(cin>>n)
	{
		for(int i=0;i<n;i++)
			cin>>a[i].x>>a[i].y;
		sort(a,a+n,cmp);
		
		int count=1;//计数器 
		for(int i=0;i<n;i++)
		{
			if(a[i].y<a[i+1].x)
				count++;
			else
				a[i+1].y=min(a[i].y,a[i+1].y); 
		}
		cout<<count<<endl;
	} 

} 

发布了19 篇原创文章 · 获赞 0 · 访问量 655

猜你喜欢

转载自blog.csdn.net/Hdjjdsbjj/article/details/104730963