P1083题解整理(供日后自己看)

149 阅读1分钟

在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分,问最大的k为多少。

最左边的线段放什么最好?

显然放右端点最靠左的线段最好,从左向右放,右端点越小妨碍越少

其他线段放置按右端点排序,贪心放置线段,即能放就放

//我已经转C++啦(小声bb
#include <bits/stdc++.h>

using namespace std;

struct game {
    int start;
    int end;
} g[1000001];

int cmp (const game& a, const game& b) {
    return a.end < b.end;
}

int main() {
    int n;
    cin >> n;

    for (int i = 0; i < n; i++) {
        cin >> g[i].start >> g[i].end;
    }

    sort (g, g + n, cmp);
    int count = 1;
    int lastEnd = g[0].end;
    for (int i = 1; i < n; i++) {
        if (g[i].start >= lastEnd) {
            count++;
            lastEnd = g[i].end;
        }
    }

    printf("%d\n", count);
}