#贪心#poj 2376 Cleaning Shifts

博客围绕在一段区间挑线段覆盖使区间完全覆盖的问题展开。分析指出可用贪心方式,先按起始点对线段排序,之后进行暴力求解,最后给出了解决该问题的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

在一段区间里挑一些线段覆盖,使区间被完全覆盖,问需要多少条线段


分析

可以用贪心的方式每次跳过一些线段,所以要按起始点排序,之后就暴力了


代码

#include <cstdio>
#include <algorithm>
struct rec{
	int a,b;
	bool operator <(const rec &x)const{return a<x.a;}
}t[25001];
int n,m,ans;
int in(){
	int ans=0; char c=getchar();
	while (c<48||c>57) c=getchar();
	while (c>47&&c<58) ans=(ans<<3)+(ans<<1)+c-48,c=getchar();
	return ans;
}
int main(){
	n=in(); m=in();
	for (register int i=1;i<=n;i++) t[i]=(rec){in(),in()};
	std::sort(t+1,t+1+n);
	int now=0; bool flag=1;
	for (register int i=1;i<=n;i++){
		if (t[i].a>now+1) {flag=0; break;}//已经不可能覆盖了
		int mx=t[i].a;
		for (register int j=i;j<=n;j++){
			if (t[j].a>now+1) break;//不可能跳过
			mx=std::max(mx,t[j].b);//找到大的线段
			i=j;//更新i(不用再跳了)
		}
		now=mx; ans++;//更新新的起始点
		if (now>=m) break;//直接退出
	}
	if (flag&&now>=m) printf("%d",ans); else printf("-1");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值