题目链接:POJ 3190 Stall Reservations
题目大意:
题解:
先按开始时间从小到大排序,然后用优先队列按结束时间从小到大的顺序去存储。
每次从优先队列中选择结束时间最小的牛,并与当前将要存入优先队列的牛作比较,判断是否可以使用同一台机器。
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
int machine[1000010], n; // 存机器的编号
struct Cow {
int start, end, id;
bool operator<(const Cow &obj) const {
if (start == obj.start) {
return end < obj.end;
} else {
return start < obj.start;
}
}
} cow[1000010], temp;
struct cmp {
bool operator()(Cow &a, Cow &b) { return a.end > b.end; }
};
priority_queue<Cow, vector<Cow>, cmp> pq;
int main() {
ios::sync_with_stdio(false);
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> cow[i].start >> cow[i].end;
cow[i].id = i;
}
sort(cow + 1, cow + 1 + n);
pq.push(cow[1]);
int ans = 1;
machine[cow[1].id] = 1;
for (int i = 2; i <= n; ++i) {
if (!pq.empty()) {
temp = pq.top();
if (temp.end < cow[i].start) { // 继续用这台机器
machine[cow[i].id] = machine[temp.id];
pq.pop();
} else { // 用一台新机器
ans++;
machine[cow[i].id] = ans;
}
}
pq.push(cow[i]);
}
cout << ans << endl;
for (int i = 1; i <= n; ++i) {
cout << machine[i] << endl;
}
return 0;
}