区间覆盖(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;
}

发布了26 篇原创文章 · 获赞 0 · 访问量 452

猜你喜欢

转载自blog.csdn.net/qq_43738677/article/details/104677016