1. 程式人生 > >區間相交問題(貪心入門)

區間相交問題(貪心入門)

區間相交問題 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

給定 x 軸上 n 個閉區間。去掉儘可能少的閉區間,使剩下的閉區間都不相交。

★演算法設計: 對於給定的 n 個閉區間,計算去掉的最少閉區間數。

Input

對於每組輸入資料,輸入資料的第一行是正整數 n (1<=n<=40,000),表示閉區間數。接下來的 n 行中,每行有 2 個整數,分別表示閉區間的 2 個端點。

Output

輸出計算出的去掉的最少閉區間數。

Sample Input

310 2015 1020 15

Sample Output

2

     這也是貪心的入門題,比較簡單,分析題意,排序很重要,排序不要排錯就ok了。

AC程式碼:

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct sgm
{
    int l,r;
} a[40010];
bool cmp(sgm A,sgm B)
{
    if(A.r!=B.r)
        return A.r<B.r;
    else
        return A.l>B.l;
}
int main()
{
    int n,i,j,t;
    while(~scanf("%d",&n))
    {
        for(i=0; i<n; i++)
        {
            scanf("%d%d",&a[i].l,&a[i].r);
            if(a[i].l>a[i].r)
            {
                t=a[i].l;
                a[i].l=a[i].r;
                a[i].r=t;
            }
        }
        sort(a,a+n,cmp);
          //for(i=0;i<n;i++)
        //printf("%d %d\n",a[i].l,a[i].r);
        int s=1,x=a[0].r;
        for(i=1; i<n; i++)
        {
            if(x<a[i].l)
            {
                x=a[i].r;
                s++;
            }
        }
        printf("%d\n",n-s);
    }
    return 0;
}