P1803 凌乱的yyy / 线段覆盖
题目背景
快 noip 了,yyy 很紧张!
题目描述
现在各大 oj 上有 n 个比赛,每个比赛的开始、结束的时间点是知道的。
yyy 认为,参加越多的比赛,noip 就能考的越好(假的)。
所以,他想知道他最多能参加几个比赛。
由于 yyy 是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加 2 个及以上的比赛。
输入格式
第一行是一个整数 n ,接下来 n 行每行是 2 个整数ai, bi (ai < bi) ,表示比赛开始、结束的时间。
输出格式
一个整数最多参加的比赛数目。
输入输出样例
输入
3
0 2
2 4
1 3
输出
2
说明/提示
对于 20\%20% 的数据, n≤10。
对于 50\%50% 的数据, n≤103。
对于 70\%70% 的数据, n≤105。
对于 100\%100% 的数据, 1≤n≤106 , 0≤a i<b i≤106。
原题链接:P1803 凌乱的yyy / 线段覆盖
题解:
这个题是一个比较经典的不相交曲线问题,只需要对结束时间进行排序然后贪心就行
/*
* ===============================================
* Filename: P1803.cpp
* Description:
* Website: https://grimoire.cn
* Copyright (c) 2020 Mr.Sen. All rights reserved.
* ===============================================
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
struct node
{
int bg;
int ed;
}a[N];
bool cmp(node s1, node s2)
{
return s1.ed < s2.ed;
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i].bg >> a[i].ed;
}
sort(a, a + n, cmp);
// 按照结束时间进行排序
int end = a[0].ed, i = 0, ans = 1;
while (i++ <= n)
{
// 依次检查每一个起点
if (a[i].bg >= end)
{
ans ++;
end = a[i].ed;
}
}
cout << ans << endl;
return 0;
}
作者:NorthCity1984
出处:https://grimoire.cn/acm/disjoint.html
版权:本文《经典不相交曲线问题》版权归作者所有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
出处:https://grimoire.cn/acm/disjoint.html
版权:本文《经典不相交曲线问题》版权归作者所有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任