51Nod 1428 活動的安排 貪心

基準時間限制:1 秒 空間限制:131072 KB 分值: 10 難度:2級算法題
 收藏
 關注
有若干個活動,第i個開始時間和結束時間是[Si,fi),同一個教室安排的活動之間不能交疊,求要安排所有活動,最少需要幾個教室? 
Input
第一行一個正整數n (n <= 10000)代表活動的個數。
第二行到第(n + 1)行包含n個開始時間和結束時間。
開始時間嚴格小於結束時間,並且時間都是非負整數,小於1000000000
Output
一行包含一個整數表示最少教室的個數。
Input示例
3
1 2
3 4
2 9
Output示例
2

思路:

    安排完所有的活動,使得使用的教室數目最少,也就是每一個教室安排的活動儘可能的多!

如何使每一個教室的活動儘可能的多呢?按照結束時間遞增順序排序,使得結束時間最早,意味着給接下來的活動留出更多的

時間。

#include <bits/stdc++.h>
using namespace std;
const int N = 10000+5;
struct node {
    int s,f;
    node(int _s,int _f) {
        s = _s; f = _f;
    }
    node(){};
    bool operator < ( const node &a ) const {
        if ( a.f!=f ) return f>a.f;
        else return s>a.s;
    }
};
bool cmp( const node &a,const node b ) {
    return a.s<b.s;
}
vector<node> vec;
priority_queue<node> que;
int main()
{
    int n;
    int s,f;
    cin>>n;
    for ( int i=0; i<n; i++) {
        scanf("%d%d",&s,&f);
        vec.push_back( node(s,f) ) ;
    }
    sort( vec.begin(),vec.end(),cmp );

    que.push( vec[0] ) ;
    node t;
    for ( int i=1; i<n; i++ ) {
        t = que.top();
        if ( vec[i].s<t.f ) {
            que.push( vec[i] ) ;
        } else {
            que.pop();
            que.push( vec[i] ) ;
        }
    }

    cout<<que.size()<<endl;
    return 0;
}

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