經典活動安排問題:給定 n 個活動,各有開始/結束時間。選最大兼容子集(不重疊)。多測試案例,n=0 結束。
證明:最早結束的活動留給後續最多空間。算法:
last_end。last_end,選中,更新 last_end。#include
using namespace std;
struct Act { int s, e; };
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
while (cin >> n, n) {
vector a(n);
for (auto &x : a) cin >> x.s >> x.e;
sort(a.begin(), a.end(), [](Act &a, Act &b) {
return a.e < b.e || (a.e == b.e && a.s < b.s);
});
int cnt = 0, last = -1;
for (auto &x : a) if (x.s >= last) {
++cnt;
last = x.e;
}
cout << cnt << '\n';
}
return 0;
}
排序 O(n log n),掃描 O(n)。n ≤ 100 瞬間完成。
n=0 結束,注意讀入邊界。