1323:【例6.5】活动选择——贪心+结构体排序

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

现在给出n个活动使用礼堂的起始时间begini和结束时间endi(begini

【输入】
第一行一个整数n(n≤1000);

接下来的n行,每行两个整数,第一个begini,第二个是endi(begini

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

【输入样例】
11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13
【输出样例】
4

分析

  1. 由于尽可能安排多的活动举办,我们开始想,如果控制开始时间进行安排的话,会造成,可能某个活动开始时间很早,但是一直持续到结束,这就不合适了;所以改变策略,考虑以活动结束时间作为参照标准,按结束时间从小到大进行排序,这样就会尽可能的多安排活动,都早结束,这样举办的活动也就多,即可解决问题;
  2. 结构体存每个活动的时间,自定义排序按照结束时间排序;然后判断,当前活动开始时间是否在上一个活动结束时间preEnd之后即可举办;是的话即可举办,ans++;
#include

using namespace std;

struct node {
    int begin, end;

    //以结束时间从大到小排序
    friend bool operator<(node node1, node node2) {
        return node1.end < node2.end;
    }
};

int n, ans;
node a[1010];

int main() {
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> a[i].begin >> a[i].end;
    }
    sort(a, a + n);
    //第一个结束时间最早的默认安排上了
    int preEnd = a[0].end;//上一个确定举办的活动结束时间
    ans = 1;
    for (int i = 1; i < n; i++) {
        //当前活动开始时间 在上一个活动结束时间之后即可举办
        if (a[i].begin >= preEnd) {
            preEnd = a[i].end;//更新
            ans++;
        }
    }
    cout << ans;
    return 0;
}

你可能感兴趣的:(贪心,信奥一本通,排序,算法)