第1题 录制节目
题目描述
电视里将要播放 n n n 个节目,第 i i i 个节目从时刻 s i s_i si 开始,到 t i t_i ti 结束,没有回放。小爱有两台录像机,利用这两台录像机,小爱最多可以录下多少完整的节目呢?
如果某节目的结束时间等于另一个节目的开始时间,那么这两个节目是可以用一台录像机的。
输入格式
第一行:单个整数 n n n
第二行到第 n + 1 n+1 n+1 行:第 i + 1 i+1 i+1 行有两个整数 s i s_i si 和 t i t_i ti
输出格式
单个整数:表示最大可以录制的节目数量。
数据范围
对于 30 % 30\% 30% 的数据, n ≤ 500 n\leq 500 n≤500
对于 60 % 60\% 60% 的数据, n ≤ 2000 n\leq 2000 n≤2000
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 200 , 000 1\leq n\leq 200,000 1≤n≤200,000, 0 ≤ s i , t i ≤ 1 , 000 , 000 , 000 0\leq s_i,t_i\leq 1,000,000,000 0≤si,ti≤1,000,000,000
样例输入
5
1 5
2 6
8 10
3 9
5 10
样例输出
4
问题分析
类似 活动选择问题
的经典贪心问题。区别就是有两个录像机,算法稍调整一下就好了。
先将所有节目按结束时间排序,用两个变量 endt1, endt2 标记两个录像机录制节目的结束时间。设endt1 <= endt2,节目优先用endt2对应的录像机录制并维护 endt1 <= endt2(endt1 > endt2就交换)。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2E5 + 10;
struct nod{
int s, t;
}a[MAXN];
bool cmp(nod p, nod q){
return p.t < q.t;
}
int n, ans = 0;
int main(){
cin >> n;
for (int i = 0; i < n; ++i)
cin >> a[i].s >> a[i].t;
sort(a, a + n, cmp);
int endt1 = 0, endt2 = 0;
for (int i = 0; i < n; ++i)
if (a[i].s >= endt2){
ans++;
endt2 = a[i].t;
} else if (a[i].s >= endt1){
ans++;
endt1 = a[i].t;