8602 区间相交问题

来源:互联网 发布:网络招生代理 编辑:程序博客网 时间:2024/05/20 06:25

8602 区间相交问题(必做)

时间限制:1000MS  内存限制:1000K
提交次数:1966 通过次数:468

题型: 编程题   语言: C++;C;VC;JAVA

Description

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

注意:这里,若区间与另一区间之间仅有端点是相同的,不算做区间相交。例如,[1,2]和[2,3]算是不相交区间。 


输入格式

第一行一个正整数n(n<=50),表示闭区间数。接下来n行中,每行2个整数,表示闭区间的2个整数端点。



输出格式

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



输入样例

3
10 20
10 15
12 15


输出样例

2

 

这个问题基本等同于书本的活动安排问题。
网上的一种用了pair,所以写得有点恶心。记住 second 是左端点, first 才是右端点就行了。
#include <iostream>#include <utility>#include <algorithm>using namespace std;
int main(){    int n;
    while(cin>>n)    {        pair<int,int> p[n];        for(int i=0; i<n; i++)        {            cin >> p[i].second;            cin >> p[i].first;            if(p[i].second > p[i].first)            {                swap(p[i].second, p[i].first);            }        }        sort(p, p+n);        int last, cnt;        last = p[0].first;        cnt = 1;        for(int i=1; i<n; i++)        {            if(p[i].second >= last)            {                cnt++;                last = p[i].first;            }        }        cout << n - cnt << endl;    }    return 0;}
第二种:#include <iostream> 
#include <string.h>
#include <algorithm>//c++ sort
using namespace std;
int cmp( const int &a, const int &b ){
if( a > b )
return 1;
else
return 0;
}// sort(a,a+n,cmp);
struct Extent
{
    int a,b;
    bool operator < (const Extent& S)const
    {
        return b < S.b;
    }
}B[10002];
int main()
{
    int s[100];
    int f[100];
    int n,m;
    cin >>n;
    m=n;
    for(int i=1;m>0;i++,m--){
        cin >>B[i].a;
        cin >>B[i].b;
    }
    sort(B,B+n);
 //   int A[100];
   // memset(A,0,100*sizeof(int));
     int sum=0;
    int end = -1;
    for(int i=1;i<=n;i++){
        if(end<=B[i].a){
            end=B[i].b;
            sum++;
        }
    }
    cout << n-sum << endl;
    return 0;
}
第三种:#include <iostream>#include <stdio.h>using namespace std;int n;int s[100];int e[100];void myS(){    for(int i=0;i<n;i++){        for(int j=i;j<n;j++){            if(e[i]>e[j]){  //注意是比较结束时间                int temp = s[i];                s[i] = s[j];                s[j] = temp;                temp = e[i];                e[i] = e[j];                e[j] = temp;            }        }    }}int main(){    freopen("in.txt","r",stdin);    cin >> n;    for(int i=0;i<n;i++)        cin >> s[i] >> e[i];    myS();    int num =1; // 注意num 至少为1    int ee = e[0];  //假定第一个为标准    for(int i=1;i<n;i++){            if(ee<=s[i]){  //注意是>= 边界问题                num++;                ee = e[i];            }        }    cout << n-num << endl;    return 0;}

 

0 0