zoukankan      html  css  js  c++  java
  • TOJ 5945: 区间覆盖问题

    5945: 区间覆盖问题

    数轴上有N个闭区间[Ai, Bi],选择尽量少的区间覆盖一条指定线段[S, T]。

    输入

     

    第一行为包含三个整数N(1 <= N <=10^5),S和T(-10^6 <= S < T <= 10^6) 

    接下来N行,每行2个整数Ai,Bi(-10^6 <= Ai < Bi < 10^6)

    输出

     

    输出包含一个整数,表示最少需要的区间的个数。如果无解,输出 No Solution

    样例输入

     

    8 1 10
    -3 -1
    13 16
    0 3
    2 6
    3 5
    6 10
    5 6
    4 10

    样例输出

     3

     对输入输入的数据按照左端点进行排序初始化基准点为需要覆盖区间左端点寻找左端点比基准点小的且右端点比基准点大的区间在这些区间里面寻找右端点最大的更新基准点

    #include <bits/stdc++.h>
    using namespace std;
    struct jilu
    {
        int l,r;
    }a[100010];
    bool cmp(jilu a,jilu b)
    {
        return a.l<b.l;
    }
    int main()
    {
        int n,s,t,sum=0,f=1;
        cin>>n>>s>>t;
        for(int i=0;i<n;i++)
        {
            cin>>a[i].l>>a[i].r;
        }
        sort(a,a+n,cmp);
        int jidian=s,maxrl=-0x3f3f3f3f3f3f,f1=0;//这个maxrl挺坑的刚开始设了0WA了两次..
        for(int i=0;i<n;i++)
        {
            if(jidian>=t)
                break;
            if(a[i].l<=jidian&&a[i].r>jidian)
            {
                maxrl=max(maxrl,a[i].r);
                f1=1;
            }
            if(a[i].l>jidian&&f1==0)
            {
                break;
                f=0;
            }
            else if(a[i].l>jidian&&f1==1)
            {
                sum++;
                jidian=maxrl;
                i--;
                maxrl=-0x3f3f3f3f3f3f;
                f1=0;
            }
            else if(i==n-1)//退出时需要更新
            {
                sum++;
                jidian=maxrl;
            }
        }
            if(f!=0&&jidian>=t)
                cout<<sum<<endl;
            else
                cout<<"No Solution"<<endl;
        }
  • 相关阅读:
    day2-元组 列表-赋值和深浅拷贝
    day1-bytes类型 三元运算 进制
    DAY02
    DAY02
    Python格式化、显示颜色
    DAY02
    DAY02
    DAY02
    DAY02
    DAY02
  • 原文地址:https://www.cnblogs.com/xbqdsjh/p/11410113.html
Copyright © 2011-2022 走看看