[贪心]AT5748题解

贪心算法解决区间覆盖问题
该博客介绍了如何使用贪心算法解决区间覆盖问题。通过将区间右端点排序,选择能放入当前空间的最大区间,从而达到放置最多区间的最优解。代码中展示了具体的实现过程,包括输入处理、排序和判断区间是否能被覆盖的逻辑,最终输出放置的区间数量。

题目传送门 洛谷

思路

很显然,这个题目一看就知道是一个贪心题目。

由于我们要放上去尽量多的区间,所以我们可以把这个区间的右端点从小到大排序。为什么我们要按照右端点进行排序呢?因为如果我们选择的右端点越小,我们剩余的空间也就越大。剩余空间越大,可以放置的区间也就越多。所以根据这种思想,我们就会选择将每个区间的右端点从小到大排序。并且这样的出来的答案一定是最多的。

代码

#include<bits/stdc++.h>//万能头
using namespace std;
int n;
int x[100005],p[100005];
struct node
{
	int l,r;
	bool operator <(const node &n)const
	{
		return r<n.r;//按照右端点进行排序
	}
}arr[100005];//储存每个区间的右端点和左端点
int main()
{
	cin>>n;
	for(int i=1;i<=n;++i)
	{
		cin>>x[i]>>p[i];
		arr[i].l=x[i]-p[i];//储存左端点
		arr[i].r=x[i]+p[i];//储存右端点
	}
	sort(arr+1,arr+n+1);//排序
	int now=INT_MIN,ans=0;
	for(int i=1;i<=n;++i)
	{
		if(arr[i].l>=now)//判断是否可以放下这个区间
		ans++,now=arr[i].r;
	}
	cout<<ans<<endl;//输出答案
}

完结撒花

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值