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

    问题描述:

    数轴上有 n (1<=n<=25000)个闭区间 [ai, bi],选择尽量少的区间覆盖一条指定线段 [1, t]( 1<=t<=1,000,000)。
    覆盖整点,即(1,2)+(3,4)可以覆盖(1,4)。
    不可能办到输出-1

    输入

       第一行:N和T
       第二行至N+1行: 每一行一个闭区间。

    输出

    选择的区间的数目,不可能办到输出-1

    样例输入

    3 10
    1 7
    3 6
    6 10

    样例输出

    2

    My Solution

    贪心算法

    贪心指标:按照区间左端点排序,每次选取右端点作为下一次的起点。

    Code

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 using namespace std;
     6 const int MAXX=100000;
     7 struct node
     8 {
     9     int l,r;
    10     node(){
    11         l=r=0;
    12     }
    13 }t[MAXX];
    14 
    15 int n,m;
    16 inline bool cmp(node A,node B){
    17     return A.l<B.l;
    18 }
    19 int main(){
    20    while(~scanf("%d%d",&n,&m)){
    21    
    22    int num=n;
    23    for(int i=1;i<=n;++i){
    24     int x,y;
    25     scanf("%d%d",&x,&y);
    26     if(x>m){
    27         num--;
    28         continue;}
    29     t[i].l=x;
    30     t[i].r=y;
    31    }
    32    sort(t+1,t+n+1,cmp);
    33    int pos,rr,cnt;
    34    pos=rr=1;
    35    cnt=0;
    36    while(rr<=m&&pos<=num){
    37     int rmax=0;
    38       while(t[pos].l<=rr&&pos<=num){
    39         rmax=max(rmax,t[pos].r);
    40         ++pos;
    41       }
    42       cnt++;
    43       if(rmax+1<=rr)break;
    44       rr=rmax+1;
    45    }
    46    if(rr>m)cout<<cnt<<endl;
    47    else cout<<-1<<endl;
    48    }
    49    return 0;
    50 }
    流转星云
  • 相关阅读:
    手动渗透测试漏洞
    博弈论一 [ 巴什游戏 ]
    [Error]EOL while scanning string literal
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
  • 原文地址:https://www.cnblogs.com/liuzhuan-xingyun/p/12491574.html
Copyright © 2011-2022 走看看