区间覆盖
描述
数轴上有 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;
}