思路:
题目等价于已知n个任务的长度与右端点,求最多任务数。
非常明显的贪心,按q选取?按d选取?都不能得到正确的解。
贪心策略:
1. 按照截止时间d排序,优先考虑更早截止的。
2. 符合条件的便直接加入选择的队列中。
3.不符合条件时,尝试与选择队列中时间最长交换,这样只会产生更优的解。
题目等价于已知n个任务的长度与右端点,求最多任务数。
非常明显的贪心,按q选取?按d选取?都不能得到正确的解。
贪心策略:
1. 按照截止时间d排序,优先考虑更早截止的。
2. 符合条件的便直接加入选择的队列中。
3.不符合条件时,尝试与选择队列中时间最长交换,这样只会产生更优的解。
#include <set>
#include <map>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <deque>
#include <cstdio>
#include <string>
#include <vector>
#include <cctype>
#include <sstream>
#include <utility>
#include <cstring>
#include <cstdlib>
#include <functional>
#include <iostream>
#include <algorithm>
#define SF(a) scanf("%d", &a)
#define PF(a) printf("%d\n", a)
#define SFF(a, b) scanf("%d%d", &a, &b)
#define SFFF(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define SFFFF(a, b, c, d) scanf("%d%d%d%d", &a, &b, &c, &d)
#define CLEAR(a, b) memset(a, b, sizeof(a))
#define IN() freopen("in.txt", "r", stdin)
#define OUT() freopen("out.txt", "w", stdout)
#define FOR(i, a, b) for(int i = a; i < b; ++i)
#define ALL(a) (a).begin(), (a).end()
#define SZ(a) (int)(a).size()
#define PB push_back
#define LL long long
#define mod 10007
#define inf 1000007
#define eps 1e-5
using namespace std;
int buf[20];
int read() {
int x = 0; char ch = getchar(); bool f = 0;
while (ch < '0' || ch > '9') { if (ch == '-') f = 1; ch = getchar(); }
while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
return f ? -x : x;
}
void write(int x) {
if (!x) { putchar(48); return; }
int l = 0; if (x < 0) putchar('-'), x = -x;
while (x) buf[++l] = x % 10, x = x / 10;
while (l) putchar(buf[l--] + 48);
}
//-------------------------chc------------------------------//
const int maxn = 800000 + 5;
struct Node {
int d, r;
bool operator<(const Node &rhs) const {
return d < rhs.d;
}
}a[maxn];
bool cmp(const Node &a, const Node &b) {
return a.r < b.r;
}
int main() {
//IN(); OUT();
int T = read();
while (T--) {
int n = read();
FOR(i, 0, n) a[i].d = read(), a[i].r = read();
sort(a, a + n, cmp);
int ans = 0;
priority_queue<int> q;
int sum = 0;
FOR(i, 0, n) {
if (sum + a[i].d <= a[i].r) {
q.push(a[i].d);
sum += a[i].d;
ans++;
}
else {
if (q.empty()) continue;
if (a[i].d < q.top()) {
sum += a[i].d - q.top();
q.pop();
q.push(a[i].d);
}
}
}
PF(ans);
if(T) putchar('\n');
}
return 0;
}