P1803 凌乱的yyy / 线段覆盖——贪心、时间线段覆盖、模拟
题目背景
快 noip 了,yyy 很紧张!
题目描述
现在各大 oj 上有 \(n\) 个比赛,每个比赛的开始、结束的时间点是知道的。
yyy 认为,参加越多的比赛,noip 就能考的越好(假的)。
所以,他想知道他最多能参加几个比赛。
由于 yyy 是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加 \(2\) 个及以上的比赛。
输入格式
第一行是一个整数 \(n\),接下来 \(n\) 行每行是 \(2\) 个整数 \(a_{i},b_{i}\ (a_{i}<b_{i})\),表示比赛开始、结束的时间。
输出格式
一个整数最多参加的比赛数目。
输入输出样例 #1
输入 #1
3 0 2 2 4 1 3
输出 #1
2
说明/提示
- 对于 \(20\%\) 的数据,\(n \le 10\);
- 对于 \(50\%\) 的数据,\(n \le 10^3\);
- 对于 \(70\%\) 的数据,\(n \le 10^{5}\);
- 对于 \(100\%\) 的数据,\(1\le n \le 10^{6}\),\(0 \le a_{i} < b_{i} \le 10^6\)。
题解
#include <iostream> #include <algorithm> #include <vector> using namespace std; // 定义结构体来存储比赛的开始时间和结束时间 struct Contest { int start; int end; }; // 比较函数,用于按照比赛结束时间对比赛进行排序 bool compare(const Contest& c1, const Contest& c2) { return c1.end < c2.end; } int main() { int n; cin >> n; // 存储所有比赛信息的向量 vector<Contest> contests(n); // 读取每个比赛的开始时间和结束时间 for (int i = 0; i < n; ++i) { cin >> contests[i].start >> contests[i].end; } // 按照比赛结束时间对比赛进行排序 sort(contests.begin(), contests.end(), compare); // 初始化参加比赛的数量为 1,因为至少可以参加第一个比赛 int count = 1; // 记录上一个参加比赛的结束时间 int lastEnd = contests[0].end; // 遍历排序后的比赛列表 for (int i = 1; i < n; ++i) { // 如果当前比赛的开始时间大于等于上一个比赛的结束时间 if (contests[i].start >= lastEnd) { // 可以参加当前比赛,参加比赛的数量加 1 ++count; // 更新上一个参加比赛的结束时间为当前比赛的结束时间 lastEnd = contests[i].end; } } // 输出最多能参加的比赛数量 cout << count << endl; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律