Q - 区间相交问题

题目:

给定 x 轴上 n 个闭区间。去掉尽可能少的闭区间,使剩下的闭区间都不相交。

★算法设计: 对于给定的 n 个闭区间,计算去掉的最少闭区间数。

Input

对于每组输入数据,输入数据的第一行是正整数 n (1<=n<=40,000),表示闭区间数。接下来的 n 行中,每行有 2 个整数,分别表示闭区间的 2 个端点。

Output

输出计算出的去掉的最少闭区间数。

Sample Input

3
10 20
15 10
20 15

Sample Output

2

思路:

这道题是道贪心题,要注意的是要求被删除的区间的个数,那么尽量把区间范围小的留下来,区间范围大的删去,这样结果才会正确。

代码如下:

#include<stdio.h>
#include<algorithm>
using namespace std;

struct node
{
    int l;//区间的左端点;
    int r;//区间的右端点;

} a[40001];

bool cmp(node q,node w)
{
    if(q.r!=w.r)
        return q.r<w.r;//按照右边界从小到大排序;
    else
        return q.l>w.l;//如果右边界相同,就把左边界从大到小进行排序;
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int i,q,w,sum=1,k=0;//sum统计不用删去的区间个数
        for(i=0; i<n; i++)
        {
            scanf("%d%d",&q,&w);
            if(q<w)     //左右边界的大小要重新排序;
            {
                a[i].l=q;
                a[i].r=w;
            }
            else
            {
                a[i].l=w;
                a[i].r=q;
            }
        }
        sort(a,a+n,cmp);
        /*for(i=0;i<n;i++)
        {
            printf("%d %d\n",a[i].l,a[i].r);
        }*/
        k=a[0].r;
        for(i=1; i<n; i++)
        {
            if(a[i].l>k)
            {
                sum++;//如果左边界大于上一个的右边界,这这个区间就不用删去;
                k=a[i].r;
            }
        }
        printf("%d\n",n-sum);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/titi2018815/article/details/81109347
Q A
q