51nod 1428 活动安排问题 贪心

来源:互联网 发布:mac装win7镜像下载 编辑:程序博客网 时间:2024/05/06 05:49
有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室? 
Input
第一行一个正整数n (n <= 10000)代表活动的个数。第二行到第(n + 1)行包含n个开始时间和结束时间。开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
Output
一行包含一个整数表示最少教室的个数。
Input示例
31 23 42 9
Output示例
2
曹鹏 (题目提供者)
C++的运行时限为:1000 ms ,空间限制为:131072 KB 示例及语言说明请按这里



贪心算法,需要用到优先队列。
priority_queue<int ,vector<int >,greater<int> >s;
先输出小的。
我们用它保存y值。首先先把第一个活动的y值放入。
之后进入for循环,如果当前的开始时间小于队列中第一个(也就是最早结束的时间),那么我们只能重新开一个教室,并把当前的结束时间放入队列当中。 如果大于等于,那就把那个拿走,那当前的放入。

可以说就是不停地和已有的教室的结束时间作比较。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
struct node
{
    long long x;
    long long y;


}a[100001];
priority_queue<int ,vector<int >,greater<int> >s;
bool cmp(node t1,node t2)
{
    return t1.x<t2.x;
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
       cin>>a[i].x>>a[i].y;
    }
    sort(a+1,a+1+n,cmp);
    int ans=1;
    s.push(a[1].y);
    for(int i=2;i<=n;i++)
    {


        int t=s.top();
        if(a[i].x>=t)
        {
            s.pop();
            s.push(a[i].y);
        }
        else
        {
            ans++;
            s.push(a[i].y);
        }


    }
    cout<<ans<<endl;
    return 0;
}