1. 程式人生 > >8602 區間相交問題

8602 區間相交問題

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;
}