暴力写法,直接模拟:
#include <bits/stdc++.h>
using namespace std;
int c, k;
const int N = 3000;
int cnt;
struct G {
int l, r;
} a[N];
struct {
int v, num;
} b[N];
int main() {
cin >> c >> k;
for (int i = 0; i < c; i++) {
cin >> a[i].l >> a[i].r;
}
for (int i = 0; i < k; i++) {
cin >> b[i].v >> b[i].num;
}
for (int i = 0; i < c; i++) {
for (int j = 0; j < k; j++) {
if (b[j].v >= a[i].l && b[j].v <= a[i].r && b[j].num != 0) {
cnt++;
b[j].num--;
}
}
}
cout << cnt << endl;
return 0;
}
正解
#include <bits/stdc++.h>
using namespace std;
const int N = 3000;
struct Point {
int l, r;
} a[N];
bool cmp(Point a, Point b) {
if (a.l == b.l)
return a.r < b.r;
return a.l < b.l;
}
int n, m;
priority_queue<int, vector<int>, greater<int>> q;
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++)
cin >> a[i].l >> a[i].r;
for (int i = 0; i < m; i++) {
int v, num;
cin >> v >> num;
for (int j = 0; j < num; j++)
q.push(v);
}
//升序排序
sort(a, a + n, cmp);
int cnt = 0;
for (int i = 0; i < n; i++) {
while (q.size()) {
int t = q.top();
if (t >= a[i].l && t <= a[i].r) {
cnt++;
q.pop();
break; //当前店员吃了该甜品之后就不再吃了
}
if (t > a[i].r)
break; //如果超出r,当前人店员就不考虑当前甜品
q.pop();
}
}
cout << cnt << endl;
return 0;
}