区间覆盖问题

来源:互联网 发布:网络托管业务 编辑:程序博客网 时间:2024/05/30 23:36
Problem 1230 区间相交问题

Accept: 615    Submit: 1879
Time Limit: 1000 mSec    Memory Limit : 32768 KB

 Problem Description

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

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

 Input

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

 Output

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

 Sample Input

310 2015 1020 15

 Sample Output

2
/**此题算是比较经典的区间覆盖问题,由于我当时没有考虑到区间上下限的细节,导致wrong了一次,在给定 x 轴上 n 个闭区间。去掉尽可能少的闭区间,使剩下的闭区间都不相交。就是相邻的两个不相交区间留下最短的两个,所以定义一个结构体,分别存放每一个区间的下限和上限(一定要注意下限小于上限要排一下序)然后按区间上限升序排列,区间上限相等时区间下限按降序排列,然后依次选区间就可以了,用n减去被选去的区间,就是没有被选用的区间,涉及到,贪心的思想。*/#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;struct M{    int F;    int T;} minSum[40010];bool cmp(const M&a, const M&b){    if(a.T != b.T)        return a.T < b.T;    return a.F > b.F;}int main(){    int n;    while(~scanf("%d",&n))    {        for(int i = 0; i < n; i++)        {            scanf("%d%d",&minSum[i].F,&minSum[i].T);            int temp;            if(minSum[i].F > minSum[i].T)            {                temp = minSum[i].F;                minSum[i].F = minSum[i].T;                minSum[i].T = temp;            }        }                sort(minSum, minSum+n, cmp);        int ans = 1,min = minSum[0].T;                for(int i = 1; i < n; i++)            if(minSum[i].F > min)            {                ans++;                min = minSum[i].T;            }        printf("%d\n",n - ans);    }    return 0;}

0 0
原创粉丝点击