某餐馆有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 52 4 21 33 53 75 91 10
输出例子:20
C++源代码:
#include<iostream> #include<algorithm> #include <vector> 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<Table> vec_T(n); vector<Customer> 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; }
名企笔试:滴滴出行2017秋招笔试(餐馆消费问题)2017-03-06 算法爱好者
最新推荐文章于 2022-04-15 11:13:17 发布