名企笔试:滴滴出行2017秋招笔试(餐馆消费问题)2017-03-06 算法爱好者

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

输入描述:
输入包括m+2行。
第一行两个整数n(1 <= n <= 50000),m(1 <= m <= 50000)
第二行为n个参数a,即每个桌子可容纳的最大人数,以空格分隔,范围均在32位int范围内。
接下来m行,每行两个参数b,c。分别表示第i批客人的人数和预计消费金额,以空格分隔,范围均在32位int范围内。

输出描述:
输出一个整数,表示最大的总预计消费金额

输入例子:
3 5
2 4 2
1 3
3 5
3 7
5 9
1 10

输出例子:

20

C++源代码:

#include
#include
#include  
using namespace std;

class Customer				//声明顾客类
	{
		public:
		int num;			//每批顾客人数
		int money;			//每批顾客预计消费金额
		Customer()
		{
			num = 0;
			money = 0;
		}
	};

class Table					//餐桌类
	{
		public:
		int num;			//每张餐桌能容纳人数
		int state;			//每张餐桌状态,0为空,1为满
		Table()
		{
			num = 0;
			state = 0;
		}
	};


//先按照消费金额进行降序,金额一样时按照人数升序  
bool sortByAll(const Customer &c1, const Customer &c2)
{
	if (c1.money > c2.money)
		return true;
	else if (c1.money < c2.money)
		return false;
	else
		return c1.num < c2.num;
}

//餐桌按能容纳人数升序
bool sortBynum(const Table &t1, const Table &t2)
{
	return t1.num < t2.num;
}

int main()
{
	int n, m;
	int i, j;
	int Max_money = 0;
	
	cin >> n >> m;
	vector vec_T(n);
	vector vec_C(m);
	for (i = 0;i < n;i++)							//输入各餐桌能容纳人数
		cin >> vec_T[i].num;
	for (j = 0;j < m;j++)							//输入顾客人数及预计消费金额
		cin >> vec_C[j].num >> vec_C[j].money;
	sort(vec_C.begin(), vec_C.end(), sortByAll);	//顾客按金额降序,按人数升序
	sort(vec_T.begin(), vec_T.end(), sortBynum);	//餐桌按能容纳人数升序

	for (i = 0;i < m;i++)			//按消费金额依次安排入座
		for (j = 0;j < n;j++)
			if (vec_C[i].num <= vec_T[j].num && vec_T[j].state == 0)
			{
				vec_T[j].state = 1;
				Max_money += vec_C[i].money;
				break;
			}
	cout << Max_money << endl;

	return 0;
} 
  

你可能感兴趣的:(名企笔试)