51Nod 1133 不重疊的線段 貪心

基準時間限制:1 秒 空間限制:131072 KB 分值: 10 難度:2級算法題
 收藏
 關注
X軸上有N條線段,每條線段有1個起點S和終點E。最多能夠選出多少條互不重疊的線段。(注:起點或終點重疊,不算重疊)。
例如:[1 5][2 3][3 6],可以選[2 3][3 6],這2條線段互不重疊。
Input
第1行:1個數N,線段的數量(2 <= N <= 10000)
第2 - N + 1行:每行2個數,線段的起點和終點(-10^9 <= S,E <= 10^9)
Output
輸出最多可以選擇的線段數量。
Input示例
3
1 5
2 3
3 6
Output示例
2

思路:

這個題目和1428有相通之處。

要求得最多的不重疊線段。即在一個教室裏安排儘可能多的活動。

按照終點遞增排序,起點的順序其實無所謂。

拿E最小的。證明:

假設x1.e<x2.e

如果拿x2,那麼這種情況下的所有結果都已包含在x1的裏面。


#include <bits/stdc++.h>
using namespace std;

struct node {
    int l,r;
    node(){};
    node(int _x,int _y){ l = _x,r = _y; }
};

vector<node> vec;
bool cmp( const node &a,const node &b ) {
    if ( a.r!=b.r ) return a.r<b.r;
    else return a.l>b.l;
}
int main()
{
    int n;
    int l,r;
    cin>>n;
    for ( int i=0; i<n; i++ ) {
        scanf("%d%d",&l,&r);
        vec.push_back( node(l,r) ) ;
    }
    sort( vec.begin() , vec.end() , cmp );
    int e;
    e = vec[0].r;
    int ans = 1;
    for ( int i=1; i<vec.size(); i++ ) {
        if ( vec[i].l>=e ) {
            e = vec[i].r;
            ++ans;
        }
    }
    cout<<ans<<endl;
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章