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;

}


发布了98 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43661234/article/details/104343676