UVA10020:Minimal coverage(最小区间覆盖)

题目: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=68990#problem/M

题目需求:数轴上有n个闭区间[ai,bi],选择尽量少的区间覆盖一条指定的线段[0,m]。

题目解析:没什么好说的,就是贪心,具体看代码。

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <queue>
#define inf 0x3f3f3f3f
#define eps 1e-9
typedef long long ll;
using namespace std;
struct node
{
    int l,r;
}q[100010];
int n,tt,s,e,key;
int p[100010][2];
int cmp(const void *a,const void *b)
{
    struct node *aa=(struct node *)a;
    struct node *bb=(struct node *)b;
    if(aa->l!=bb->l)
    return aa->l-bb->l;
    else return aa->r-bb->r;
}
bool ff;
int main()
{
    int T,sum,xx,yy;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        tt=0;
        s=0,e=n;
        sum=0;
        while(scanf("%d%d",&xx,&yy)!=EOF)
        {
            if(xx==0&&yy==0) break;
            if(xx<=0&&yy<=0) continue;
            if(xx<0) xx=0;
            if(yy>n) yy=n;
            q[tt].l=xx;
            q[tt++].r=yy;
        }
        qsort(q,tt,sizeof(q[0]),cmp);
        int maxx=-inf;
        while(s<e)
        {
            ff=false;
            maxx=-inf;
            for(int i=0;i<tt;i++)
            {
                if(q[i].l<=s&&maxx<q[i].r)
                {
                    key=i;
                    maxx=q[i].r;
                    ff=true;
                }
                else if(q[i].l>s)
                {
                   break;
                }
            }
            if(!ff) break;
            s=q[key].r;
            p[sum][0]=q[key].l;
            p[sum++][1]=q[key].r;
        }
        if(!ff) printf("0
");
        else
        {
            printf("%d
",sum);
            for(int i=0;i<sum;i++)
                printf("%d %d
",p[i][0],p[i][1]);
        }
        if(T!=0) cout<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zhangmingcheng/p/4272259.html