活动选择

题目描述

学校在最近几天有个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使。由于有些活动时间上有冲突,学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。

现在给出个活动使用礼堂的起始时间 Bi 和结束时间 Ei(Bi < Ei),请你帮助办公室人员安排一些活动来使用礼堂,要求安排的活动尽量多。

 

输入

第一行一个整数 n(n<=1000);

接下来的行,每行两个整数,第一个 Bi,第二个是 Ei(Bi< Ei <=32767)

 

输出

输出最多能安排的活动个数。

 

样例输入

11

3 5

1 4

12 14

8 12

0 6

8 11 

6 10

5 7

3 8 

5 9

2 13

样例输出

4

 

 

分析:每一个活动都有一个结束时间,所以我们只要想办法让这个活动尽可能早的结束,这样好余下更多的时间举办别的活动。

所以我们只要按每一个活动的结束时间从小到大排序,然后选择在前一个活动结束后尽可能早开始的活动,这样选择出来的活动一定是最多的。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define rep(i, a, n) for(int i = a; i <= n; ++i)
#define per(i, n, a) for(int i = n; i >= a; --i)
typedef long long ll;
const int maxn = 1e3 + 5;

struct Node
{
    int sta, end;
    bool operator < (const Node& other)const
    {
        return end < other.end;
    }
}a[maxn];
int n, ans = 0;
int fini = 0;    //记录当前最后一个活动的结束时间
int main()
{
    freopen("act.in", "r", stdin);
    freopen("act.out", "w", stdout);
    scanf("%d", &n);
    rep(i ,1, n) scanf("%d%d", &a[i].sta, &a[i].end);
    sort(a + 1, a + n + 1);
    rep(i, 1, n)
    {
        if(a[i].sta >= fini)
        {
            ans++;
            fini = a[i].end;
        }
    }
    printf("%d\n", ans);
    return 0;
}    

 

posted @ 2018-03-14 22:33  mrclr  阅读(314)  评论(0编辑  收藏  举报