1121: 最小区间覆盖问题(贪心算法)

在这里插入图片描述
在这里插入图片描述```c
#include
#include
#include

using namespace std;

struct data{
int l;
int r;
int len;//长度
};

bool compare(data x,data y) {return x.len>y.len;}

bool clap(int L,int R,int a,int b)
{//判断区间[L,R]与[a,b]是否有重叠部分
if(b<=L||a>=R) return false;
else return true;
}
int main()
{
int N,L,R,li,ri;
while(scanf("%d%d%d",&N,&L,&R)!=EOF)
{
if(LR)
{
int tag=0;
while(N>0)
{
scanf("%d%d",&li,&ri);
if(li
ri&&liL) tag=1;
N–;
}
if(tag
1) printf(“1\n”);
else printf("-1\n");
}
else
{
data arr[N];int i=0;//i表示数组长度
while(N>0)
{
scanf("%d%d",&li,&ri);
if(clap(L,R,li,ri))//若有重叠部分,则输入数组
{
arr[i].l=li;
arr[i].r=ri;
arr[i].len=ri-li;
i++;
}
N–;
}
if(i==0) printf("-1\n");
else
{
sort(arr,arr+i,compare);//按照区间长度排序

        /*测试 
        for(int j=0;j<i;j++)
        	printf("%d %d\n",arr[j].l,arr[j].r);
        */
        
        int left=arr[0].l,right=arr[0].r,index=1;//初始化,index指向下一条待加入的线段
        while((left>L||right<R)&&index<i)
        {
            if(left>arr[index].l) left=arr[index++].l;
            else if(right<arr[index].r) right=arr[index++].r;
        }
        /*测试 
        printf("left=%d,right=%d\n",left,right);
        */
        if(left<=L&&right>=R)
            printf("%d\n",index);
        else printf("-1\n");
    }
	}
    
}
return 0;

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值