题意:有一家大型的钢铁厂,每月初都收到大量客户的订单,订单包括定制的钢铁的数量q,以及交货的截止时间d。每个单位时间只能完成一个订单的工作,不能同时进行多个,要求怎么安排使得接受的订单最多。
思路:要使得订单最多,首先我们先按照截止日期,从小到大排序。
当
qi>qj
并且
di<dj
时,那么我们应该优先选择订单j才能使结果最优,所以我们使用优先队列来维护q值。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int MAXN = 800005;
const int N = 2000005;
struct order{
int q, d;
}o[MAXN];
int n;
int cmp (order a, order b) {
return a.d < b.d;
}
int solve() {
priority_queue<int> Q;
int t = 0, temp;
for (int i = 0; i < n; i++) {
if (o[i].q + t <= o[i].d) {
Q.push(o[i].q);
t += o[i].q;
}
else if (!Q.empty()){
temp = Q.top();
if (temp > o[i].q) {
t = t - temp + o[i].q;
Q.pop();
Q.push(o[i].q);
}
}
}
return Q.size();
}
int main() {
int cas;
scanf("%d", &cas);
while (cas--) {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d%d", &o[i].q, &o[i].d);
sort(o, o + n, cmp);
printf("%d\n", solve());
if (cas)
printf("\n");
}
return 0;
}