• 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;
    }
  • 相关阅读:
    [题解]POJ_1417_(并查集背包
    [题解]POJ_2912_(带权并查集
    [题解]luogu_P1502_窗口的星星(扫描线
    [题解/模板]POJ_1733_Pairty game(带权并查集/扩展域
    [题解/模板]悬线法luogu_P1169_棋盘制作(悬线法
    [题解]luogu_P2059_卡牌游戏(状态设计/概率dp
    [题解]luogu_P2467_地精部落(思维dp
    「CJOJ2439」军队
    「LG2397」yyy loves Maths VI (mode)
    「LG2114」起床困难综合症
  • 原文地址:https://www.cnblogs.com/hfc-xx/p/4703614.html
Copyright © 2020-2023  润新知