码蹄杯 甜品供应 知识点:优先队列

49 阅读1分钟

码题集OJ-甜品供应 (matiji.net)

暴力写法,直接模拟:

#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;
}

image.png

正解

#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;
}

image.png image.png