• UVa 10020


    Given several segments of line (int the X axis) with coordinates [Li, Ri]. You are to choose the minimal amount of them, such they would completely cover the segment [0, M].
    Input
    The first line is the number of test cases, followed by a blank line.
    Each test case in the input should contains an integer M (1 ≤ M ≤ 5000), followed by pairs “Li Ri”
    (|Li|, |Ri| ≤ 50000, i ≤ 100000), each on a separate line. Each test case of input is terminated by pair ‘0 0’.
    Each test case will be separated by a single line.
    Output
    For each test case, in the first line of output your programm should print the minimal number of line
    segments which can cover segment [0, M]. In the following lines, the coordinates of segments, sorted
    by their left end (Li), should be printed in the same format as in the input. Pair ‘0 0’ should not be
    printed. If [0, M] can not be covered by given line segments, your programm should print ‘0’ (without
    quotes).
    Print a blank line between the outputs for two consecutive test cases.
    Sample Input
    2
    1
    -1 0
    -5 -3
    2 5
    0 0
    1
    -1 0
    0 1
    0 0

    Sample Output
    0
    1
    0 1

    题意:给定一个M,和一些区间[L,R]。。要选出几个区间能完全覆盖住[0,M]区间。要求数量最少。。如果不能覆盖输出0.

        思路:贪心的思想。。把区间按R从大到小排序。 然后遇到一个满足的[Li,Ri],就更新缩小区间。。直到完全覆盖。

        注意[L,R]只有满足L小于等于且R大于当前覆盖区间左端这个条件。才能选中。

     贪心,把各区间按照R从大到小排序。如果区间1的起点不是s,无解,否则选择起点在s的最长区间。选择此区间[Li,Ri]后,新的起点设置为Ri,然后经过依次扫描之后就可以得出最小的线段数。并用另一个结构体储存路径。

    #include <stdio.h>
    #include <algorithm>
    using namespace std;
    int t;
    int start,end,n,f;
    struct qujian
    {
        int start;
        int end;
    };
    qujian q[100005],p[100005];
    int cmp (qujian a,qujian b)
    {
        return a.end > b.end;
    }
    int main()
    {
        scanf("%d", &t);
        while (t --)
        {
            n = 0;
            f = 0;
            start = 0;
            scanf("%d", &end);
            while (scanf("%d%d", &q[n].start, &q[n].end) && (q[n].start||q[n].end))
            {
                n++;
            }
            sort(q,q+n,cmp);
            while(start<end)
            {
                int i;
                for (i=0;i<n;i++)
                {
                    if (q[i].start <= start && q[i].end > start)
                    {
                        start = q[i].end;   //更新区间
                        p[f] = q[i];
                        f++;
                        break;
                    }
                }
                if (i==n) break;   //如果没有一个满足条件的区间,直接结束。
            }
            if(start<end) printf("0
    ");
            else
            {
                printf("%d
    ",f);
                for (int i=0;i<f;i++)
                    printf("%d %d
    ", p[i].start,p[i].end);
            }
            if (t) printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    java实现网络监听
    程序员必须知道FTP命令
    Java进化的尽头
    Oracle逻辑备份与恢复(Data Pump)
    JQuery日期选择器插件date-input
    大型高并发高负载网站的系统架构剖析
    万言万当,不如一默为官之道
    angular.js高级程序设计书本开头配置环境出错,谁能给解答一下
    安装meteor运行基本demo发生错误。
    nodejs 通过 get获取数据修改redis数据
  • 原文地址:https://www.cnblogs.com/hfc-xx/p/4703614.html
Copyright © 2020-2023  润新知