测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A18788. 校园活动安排

填空题 较难

题目描述

校园活动安排

题目描述

学校有n个社团活动,每个活动有开始时间l[i]和结束时间r[i]。

同一时间只能参加一个活动,活动结束瞬间可以参加下一个活动。

求最多能参加多少个活动。

输入格式

第一行一个整数n;接下来n行,每行两个整数l,r,表示活动的起止时间。

输出格式

输出一个整数,表示最多可参加的活动数量。

数据范围 1≤n≤2000

参考答案

#include <iostream> #include <algorithm> using namespace std; struct Node { int l, r; // l开始时间,r结束时间 }act[2005]; // 核心:按结束时间升序排序 bool cmp(Node a, Node b) { return a.r < b.r; } int main() { int n; cin >> n; for(int i = 0; i < n; i++) { cin >> act[i].l >> act[i].r; } sort(act, act + n, cmp); int cnt = 0; int last_end = -1; // 记录上一个活动的结束时间 for(int i = 0; i < n; i++) { if(act[i].l >= last_end) // 满足接续条件 { cnt++; last_end = act[i].r; } } cout << cnt; return 0; }

答案解析

1. 核心考点:经典最多不重叠区间模板;

2. 排序规则:按结束时间(右端点)升序,优先选结束早的活动,预留最多后续时间;

3. 遍历规则:当前活动开始时间 ≥ 上一个活动结束时间,则可选,更新结束时间;

4. 关键坑点:判断条件必须用>=,满足“结束瞬间可接续”的题目要求。

评分细则

结构体定义正确(3分)、cmp按右端点排序正确(8分,写左端点直接扣8分)、遍历判断条件正确(8分)、输入输出规范(4分)、无bug(2分)

上一题 下一题