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;
}
原文地址:https://www.cnblogs.com/hfc-xx/p/4703614.html