zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    9-29 函数嵌套及作用域链
    9-29 函数进阶_命名空间和作用域
    9-28 函数
    9-27 文件的”改”、删、重命名
    9-26 联合文件的登录注册
    9-26 文件操作一些功能详解
    9-26 文件操作
    9-26 复习数据类型
    9-25 集合
    python基础day7_购物车实例
  • 原文地址:https://www.cnblogs.com/hfc-xx/p/4703614.html
Copyright © 2011-2022 走看看