区间覆盖(week3 作业C)

区间覆盖

描述

数轴上有 n 个闭区间 [ai, bi],选择尽量少的区间覆盖一条指定线段 [1, t]。
不可能办到输出-1

输入

注意,输入包含多组测试数据,请处理到文件结束
第一行:N和
第二行至N+1行: 每一行一个闭区间。

输出

选择的区间的数目,不可能办到输出-1

样例输入

3 10
1 7
3 6
6 10

样例输出

2

提示

这道题输入数据很多,请用scanf而不是cin

我的思路:
这道题我是用贪心算法解决的。首先,明确题意,用多个区间去覆盖一段长度,且要尽量少。那么,我们可以先对区间以左端点进行升序排序。再遍历这个区间数组,若是遍历到的区间与当前区间断开了,则记录当前区间的索引,并把上一个最大区间的右端点设置为当前节点,若此时这个右端点大于或等于t,则结束遍历。特别注意,若出现两个相邻区间之间隔着一个或多个数,则不满足条件,直接跳出循环。遍历到区间数组末尾的时候,若达到要求,则所选区间数加一,否则不满足条件。

我的代码

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

struct duan
{
    int a,b;
} Ti[250000];

int N,T;

bool compare(const duan& x,const duan& y)
{
    return x.a < y.a;
}

int main()
{
    scanf("%d%d",&N,&T); 
    for(int i=0;i<N;i++)
    {
        scanf("%d%d",&Ti[i].a,&Ti[i].b);
    }
    sort(Ti,Ti+N,compare);
    int num = 0;
	int C=1,k=0,L=1,i;
	bool is = false;
	while(C<=T)
	{
		if(Ti[k].a > C)
		{
			is = true; 
			break;
		}
		else
		{
			for(i=k;i<N;i++)
			{
				if(Ti[i].a <= C)
				{
					if(Ti[i].b > L)
					{
						L=Ti[i].b;
					}
				}
				else
				{
					C=L+1;
					num++;
					k=i;
					break;
				}
			}	
		}//cout<<i<<endl;
		if(i==N)
		{
			if(L<T) is=true;
			num++;
			break;
		}
	}
	if(is) printf("-1");
	else printf("%d",num);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值