zoukankan      html  css  js  c++  java
  • 区间覆盖

    拓展阅读

    区间覆盖问题

    数轴上有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 }
  • 相关阅读:
    Java I/O (1)
    hadoop集群添加新节点
    [kuangbin带你飞]专题三 Dancing Links
    Codeforces Round #580 (Div. 2)(A、B、C)
    2019 年百度之星&#183;程序设计大赛
    [kuangbin专题] KMP
    Codeforces Round #578 (Div. 2)(A、B、C、D、E)
    二维前缀和、差分习题集
    [kuangbin带你飞]专题七 线段树
    Codeforces Round #577 (Div. 2) (A、B、C)
  • 原文地址:https://www.cnblogs.com/qingjiuling/p/10503264.html
Copyright © 2011-2022 走看看