题目描述
数轴上有n条线段,选取其中k条线段使得这k条线段两两没有重合部分,问k最大为多少。

输入描述:
第一行为一个正整数n;
在接下来的n行中,每行有2个数ai,bi描述每条线段。

输出描述:
输出一个整数,为k的最大值。

思路
这道题也算是常见的贪心中的区间问题了,我存区间中的起点与终点是喜欢使用pair关键字来存,当然也可以自己写一个类型,只是用pair类型可以直接用sort()来排序。

代码步骤:
1.输入并排序。
2.用两个变量(ans和k)都初始为0(ans是存答案,k是为了后面进行比较),在循环n遍中,如果第i个线段的起点大于或等于k,k就等于第i个线段的终点,ans++;

完整C++版AC代码

#include <iostream>
#include <algorithm>

using namespace std;

typedef pair<int, int>PII;//pair的好处是可以直接用sort,不用写小于之类的

bool cmp(PII a, PII b) {
    return a.second < b.second;
}


const int N = 10000100;
PII jl[N];//分别存线段的起点与终点

int n;

int main() {
    cin >> n;

    for (int i = 0; i < n; i++) {
        cin >> jl[i].first >> jl[i].second;
    }
    sort(jl, jl + n, cmp);

    int ans = 0, k = 0;
    for (int i = 0; i < n; i++) {
        if (jl[i].first >= k) {
            k = jl[i].second;
            ans++;
        }
    }
    cout << ans << endl;
    return 0;
}