【贪心】区间相交问题1910

题目描述

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

给定n 个闭区间,编程计算去掉的最少闭区间数。

输入

第一行是正整数n,表示闭区间数。接下来的n行中,

每行有2 个整数,分别表示闭区间的2个端点。

输出

将计算出的去掉的最少闭区间数输出到文件inte.out。

样例输入

3
10 20
10 15
20 15

样例输出

2

思路:贪心算法,策略是在可选的区间中找右区间最快结束的,所以先对所有区间按右区间主要关键,左区间次要关键字升序排序。在从排序的结果依次遍历中找右区间最快结束呢
实现代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1002;
int n;
pair<int, int> itv[maxn];
bool cmp(pair<int,int> x,pair<int,int>y)
{
    return x.second < y.second || (x.second == y.second && x.first < y.first);
}
int main()
{
    cin >> n;
    int i,t = 0;
    for(i = 0; i < n; i++)
    {
        cin >> itv[i].first >> itv[i].second;
        itv[i].first = (int)abs(itv[i].first);  //对区间绝对值,这应该是错误做法,有可能出现【-2,-1】,【1,2】这种区间,应该是两个不想交区间,但是绝对值之后变成一个不相交区间
        itv[i].second = (int)abs(itv[i].second);//但是测试数据6都是负数区间,过不去暂时先应付,还未找到解决办法 
        if(itv[i].first > itv[i].second)
        {
            t = itv[i].first;
            itv[i].first = itv[i].second;
            itv[i].second = t;
        }
    }    
    sort(itv,itv + n,cmp);
    int ans = 0;
    t = 0;
    for(i = 0; i < n; i++)
    {
        if(t < itv[i].first)
        {
            ans++;
            t = itv[i].second;
        }
    }
    cout << n - ans << endl;
    getchar();
    getchar();
    return 0;
    
}

 

posted @ 2018-11-13 16:46  LizLiz  阅读(597)  评论(0)    收藏  举报