• 贪心 URAL 1303 Minimal Coverage


    题目传送门

     1 /*
     2     题意:最少需要多少条线段能覆盖[0, m]的长度
     3     贪心:首先忽略被其他线段完全覆盖的线段,因为选取更长的更优
     4             接着就是从p=0开始,以p点为标志,选取 (node[i].l <= p && p < node[i+1].l)
     5     详细解释:http://www.cnblogs.com/freezhan/p/3219046.html
     6 */
     7 #include <cstdio>
     8 #include <iostream>
     9 #include <algorithm>
    10 #include <cstring>
    11 #include <cmath>
    12 using namespace std;
    13 
    14 const int MAXN = 1e6 + 10;
    15 const int INF = 0x3f3f3f3f;
    16 struct Node
    17 {
    18     int l, r;
    19 }node[MAXN], ans[MAXN];
    20 
    21 bool cmp(Node x, Node y)
    22 {
    23     if (x.l == y.l)    return x.r > y.r;
    24     else    return x.l < y.l;
    25 }
    26 
    27 int main(void)        //URAL 1303 Minimal Coverage
    28 {
    29     //freopen ("R.in", "r", stdin);
    30 
    31     int m;
    32     while (scanf ("%d", &m) == 1)
    33     {
    34         int n = 0;    int u, v;
    35         while (scanf ("%d%d", &u, &v) == 2 && (u || v))
    36             node[++n].l = u, node[n].r = v;
    37         sort (node+1, node+1+n, cmp);
    38 
    39         int k = 1;
    40         for (int i=2; i<=n; ++i)        //cover
    41         {
    42             if (node[k].l < node[i].l && node[k].r < node[i].r)
    43             {
    44                 node[++k] = node[i];
    45             }
    46         }
    47 
    48         n = k;    int p = 0;    int cnt = 0;
    49         node[n+1].l = node[n+1].r = m + 1;
    50         for (int i=1; i<=n; ++i)
    51         {
    52             if (node[i].l <= p && p < node[i+1].l)
    53             {
    54                 ans[++cnt] = node[i];    p = node[i].r;
    55             }
    56             if (p >= m)
    57             {
    58                 printf ("%d
    ", cnt);
    59                 for (int i=1; i<=cnt; ++i)
    60                 {
    61                     printf ("%d %d
    ", ans[i].l, ans[i].r);
    62                 }
    63                 break;
    64             }
    65         }
    66 
    67         if (p < m)    puts ("No solution");
    68     }
    69 
    70     return 0;
    71 }
    72 
    73 /*
    74 No solution
    75 */
    编译人生,运行世界!
  • 相关阅读:
    【剑指Offer】6、旋转数组的最小数字
    【剑指Offer】5、用两个栈实现队列
    【剑指Offer】4、重建二叉树
    python面试经典315
    shell面试经典70例
    vim编辑器使用
    bootstrap3基本了解
    Windows Server 2008允许多用户登录远程桌面
    配置远程桌面
    Python-Python及PyCharm的下载与安装
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4492502.html
Copyright © 2020-2023  润新知