FZU - 1230 区间相交问题

给定 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

题解:

把每个区间以y为参照从小到大排序,然后将y对下一个x进行比较,判断要删去几个区间。

贴代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
    int x,y;
} mp[40010];
bool cmp(node a,node b)///以y为参照进行排序。
{
    if(a.y==b.y)
        return a.x>b.x;
    return a.y<b.y;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int i,j,t;
        for(i=0; i<n; i++)
        {
            scanf("%d%d",&mp[i].x,&mp[i].y);
            if(mp[i].x>mp[i].y)///将区间的x,y调整好。
            {
                t=mp[i].x;
                mp[i].x=mp[i].y;
                mp[i].y=t;
            }
        }
        sort(mp,mp+n,cmp);
        int sum=n-1,ans=mp[0].y;
        for(i=1; i<n; i++)
        {
            if(ans<mp[i].x)///说明这两个区间不相连,要删去的区间减少一个。
            {
                ans=mp[i].y;
                sum--;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/gjlfly/article/details/81109320