【八中】区间覆盖问题

来源:互联网 发布:红色后代知乎 编辑:程序博客网 时间:2024/05/01 13:53

区间覆盖问题

时间限制: 1 Sec
内存限制: 128 MB

题目描述

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

输入

第1行:先是一个整数N(1 <= N <=10^6),然后是两个整数S和T(-10^7 <= S < T <= 10^7)
接下来N行,每行2个整数Ai,Bi(-10^7 <= Ai < Bi < 10^7)

输出

第1行:一个整数,表示最少需要的区间的个数。如果无解,输出 No Solution

样例输入

8 1 10-3 -113 160 32 63 56 105 64 10

样例输出

3

提示

一个可行的方案是选择3个区间:[0, 3], [2, 6], [4, 10]

【题目大解析】

(1)找到所有的、起点小于s的区间
(2)把这些区间按照终点,从小到大排序
(3)选择终点最大的那个区间,设这个最大的终点是bi
(4)现在问题变成了,“选择尽量少的区间覆盖一条指定线段[bi, t]”
(5)用相同的思路来解决这个(4)

#代码#
状态:正确

#include<bits/stdc++.h>  using namespace std;  int n,s,t;  struct node  {  int a;int b;      }a[100006];  int num;  bool cmp(node s1,node s2)  {      if(s1.a>s2.a)return 0;          else if(s1.a==s2.a)                  {                 if(s1.b<s2.b) return 0;                 }      return 1;  }  int main()  {       scanf("%d%d%d",&n,&s,&t);      for(int i=1;i<=n;i++)      scanf("%d%d",&a[i].a,&a[i].b);      sort(a+1,a+n+1,cmp);      //for(int i=1;i<=n;i++)          //printf("%d %d\n",a[i].a,a[i].b);      int j=0;      a[0].b=s;      int maxl=0;      if(a[1].a>s)       {      printf("No Solution");      return 0;      }      int x;      bool f=0;      while(num<n)      {       if(a[j].b>=t)break;      for(int i=j+1;i<=n;i++)      {         if(a[j].b>=a[i].a)          {          if(a[i].b>maxl) maxl=a[i].b,f=1,x=i;         }      }      if(f)      {          maxl=0;          f=0;          num++;          j=x;      }      else    {          num=0;          printf("No Solution");          return 0;      }      }      printf("%d",num);  }  
原创粉丝点击