zoukankan      html  css  js  c++  java
  • UVa 10020 (最小区间覆盖) Minimal coverage

    题意:

    数轴上有n个闭区间[ai, bi],选择尽量少的区间覆盖一条指定线段[0, m]

    算法:

    [start, end]为已经覆盖到的区间

    这是一道贪心

    把各个区间先按照左端点从小到大排序,更新start为end,如果区间1在start的右端,则无解,因为其他区间更不可能覆盖到

    然后在剩下的能覆盖到start的区间里面选择能覆盖到最右端的区间并更新end,然后记录在path里面。如果end的已经将m覆盖则退出循环

    如果遍历完所有的区间后end依然没能覆盖到start,则无解

    最后按照parh里面记录的路径输出区间即可

     1 //#define LOCAL
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <algorithm> 
     6 using namespace std;
     7 
     8 const int maxn = 100000 + 10;
     9 
    10 struct Range
    11 {
    12     int a, b;
    13     inline bool operator< (const Range& rhs) const
    14     {
    15         return a < rhs.a || (a == rhs.a && b < rhs.b);
    16     }
    17 }ranges[maxn];
    18 int path[maxn];
    19 
    20 int main(void)
    21 {
    22     #ifdef LOCAL
    23         freopen("10020in.txt", "r", stdin);
    24     #endif
    25 
    26     int T;
    27     scanf("%d", &T);
    28     while(T--)
    29     {
    30         int a, b, m, n = 0;
    31         scanf("%d", &m);
    32         while(scanf("%d%d", &a, &b) == 2)
    33         {
    34             if(a == 0 && b == 0)    break;
    35             if(a > m)    continue;
    36             if(a < 0)    a = 0;
    37             ranges[n].a = a;
    38             ranges[n++].b = b;
    39         }
    40         sort(ranges, ranges + n);
    41         int minCover = 0;
    42         int start = 0, end = 0;
    43         for(int i = 0; i < n; )
    44         {
    45             start = end;
    46             if(ranges[i].a > start)
    47                 break;
    48             while(i < n && ranges[i].a <= start)
    49             {
    50                 if(ranges[i].b > end)
    51                 {
    52                     end = ranges[i].b;
    53                     path[minCover] = i;
    54                 }
    55                 ++i;
    56             }
    57             ++minCover;
    58             if(end >= m)    break;
    59         }
    60         if(end < m)    minCover = 0;
    61         printf("%d
    ", minCover);
    62         for(int i = 0; i < minCover; ++i)
    63             printf("%d %d
    ", ranges[path[i]].a, ranges[path[i]].b);
    64         if(T)
    65             printf("
    ");
    66     }
    67     return 0;
    68 }
    代码君
  • 相关阅读:
    点击Notification之后收起通知栏
    Visual Studio常用的快捷键
    数据库语法二之外键
    数据引擎 创建表完整语法,字段类型,约束条件
    数据库 tcp协程实现并发 回调函数
    GIL以及协程
    进程,互斥锁,生产者消费者,线程
    udp协议,进程(同步,异步)
    单例模式,网络编程之tcp协议以及粘包问题
    网络编程
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/3949612.html
Copyright © 2011-2022 走看看