MENU

经典不相交曲线问题

September 19, 2020 • 题解

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
版权:本文《经典不相交曲线问题》版权归作者所有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

Last Modified: August 21, 2021