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;
    }

 

转载于:https://www.cnblogs.com/xbqdsjh/p/11410113.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值