滴滴出行 餐馆

题目描述

某餐馆有n张桌子,每张桌子有一个参数:a 可容纳的最大人数; 有m批客人,每批客人有两个参数:b人数,c预计消费金额。 在不允许拼桌的情况下,请实现一个算法选择其中一部分客人,使得总预计消费金额最大

#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
# define f(i,m,n) for(int i=m; i<=n; i++)
# define sf(x) scanf("%d", &x)
using namespace std;
typedef long long int ll;
struct cus {
	int m, b;
};
struct cmp {
	bool operator()(cus a, cus b) {
		return a.m < b.m;
	}
};
int _cmp(cus a, cus b) {
	return a.b < b.b;
}
priority_queue<cus, vector<cus>, cmp> q;
int a[500010];
cus b[500010];
int main() {
	int n, m;
	sf(n);sf(m);
	f(i, 1, n) sf(a[i]);
	while (!q.empty())q.pop();
	ll sum = 0;
	f(i, 1, m) {
		sf(b[i].b);sf(b[i].m);
	}
	sort(a + 1, a + 1 + n);
	sort(b + 1, b + 1 + m, _cmp);
	int j = 1;
	f(i, 1, n) {
		for (; j <= m;  j++) 
		if (a[i] >= b[j].b) q.push(b[j]);
		else break;
		if (q.empty()) continue;
		else {
			sum = sum + q.top().m;
			q.pop();
		}
	}
	printf("%lld", sum);
	return 0;
}


阅读更多
换一批

没有更多推荐了,返回首页