区间覆盖

Posted qingjiuling

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区间覆盖相关的知识,希望对你有一定的参考价值。

拓展阅读

区间覆盖问题

数轴上有n个闭区间[ai,bi],选择尽量少的区间覆盖一条指定的线段[s,t]。

分析:

把各区间按照a从小到大排序。如果区间1的起点不是s,无解,否则起点在s的最长区间。选择[ai,bi]后,新的起点设置成bi。直至覆盖整个线段。

输入:

N:测试数据组数

begin,end:要覆盖区间的起始和终止点

n:区间数。后面跟随n个区间

 

输出:

覆盖的具体区间 以及 覆盖区间的总数

代码:

#include<iostream>
#include<algorithm>
using namespace std;
 
const int maxn=20;
 
struct timetable
{
    int a;
    int b;
}time[maxn];
 
bool comp(timetable &x,timetable &y)//多看两遍 
{
        return (x.a<y.a);
}
 
 
 
int main()
{
    int i,j,N,n,count;
    int begin,end;
    while(cin>>N)//N表示有几组测试数据 
    {
        while(N--)
        {
            cin>>begin>>end;
            cin>>n;//n个区间 
            for(i=0;i<n;i++)
            {
                cin>>time[i].a;
                cin>>time[i].b;
            }
            
            sort(time,time+n,comp);//区间按照a从小到大排序 
            
            count=0;
            int len=0,maxlen,tmp;
            int newbegin=begin;
            i=0; 
            while(len<end-begin)
            {
                maxlen=0;
                for(i=0;i<n;i++)//找当前begin情况下最长 
                {
                    if(time[i].a<=newbegin)
                    {
                        tmp=time[i].b-newbegin;
                        if(tmp>maxlen)
                        {
                            maxlen=tmp;
                            j=i;
                        }    
                    }
                    else
                        break;    
                }
                
                if(maxlen==0)//说明断了,不存在连续覆盖 
                {
                    cout<<"no exit;";
                    return 0;
                }
                
                cout<<"("<<time[j].a<<","<<time[j].b<<")"<<"  ";
                len+=maxlen;
                count++;
                newbegin=time[j].b;
                
            }
            cout<<endl<<count<<endl; 
        }
    } 
} 

集合具体题目分析:题目链接

注意因为这里只看整数,我们写的是a[i].l<=mn+1(mn,mx分别为最小,和最大)

这个题比较简单,固定0-n,且不需要输出覆盖的区间

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int inf=1<<30;
 4 typedef long long ll;
 5 typedef pair<int,int> P;
 6 const double pi=acos(-1);
 7 const int mod=998244353;
 8 const int maxn=1e5+7;
 9 const int maxm=6300;
10 struct node{
11     int l,r;
12 }a[maxn];
13 bool cmp(const node &a,const node &b){
14     if(a.l==b.l) return a.r>b.r;
15     return a.l<b.l;
16 }
17 int main(){
18     int n,m;scanf("%d%d",&n,&m);
19     int ans=0,mn=0,mx=0;
20     for(int i=0;i<m;i++){
21         scanf("%d%d",&a[i].l,&a[i].r);
22     }
23     sort(a,a+m,cmp);
24     int res=0;
25     while(1){
26         if(mn>=n) break;
27         res=0;
28         for(int i=0;i<m;i++){
29             if(a[i].l<=mn+1){
30                 if(a[i].r>mx){
31                     mx=a[i].r;
32                     res=1;
33                 }
34             }
35         }
36         if(res){
37             mn=mx;ans++;
38         }
39         else break;
40     }
41     if(res){
42         cout<<ans<<endl;
43     }
44     else cout<<-1<<endl;
45     return 0;
46 }

 

以上是关于区间覆盖的主要内容,如果未能解决你的问题,请参考以下文章

区间覆盖

片段布局不覆盖整个屏幕

贪心算法_区间选点_区间分组_区间覆盖_huffman树

片段(Java) | 机试题+算法思路+考点+代码解析 2023

2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试

Android片段z-index覆盖