滴滴內推題-餐館
阿新 • • 發佈:2019-01-28
時間限制:1秒
空間限制:32768K
某餐館有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範圍內。
輸出描述:
輸出一個整數,表示最大的總預計消費金額
輸入例子1:
3 5 2 4 2 1 3 3 5 3 7 5 9 1 10
輸出例子1:
20
#include <iostream> #include <cstring> #include <vector> #include <algorithm> #include <set> using namespace std; struct node { int num; int val; }; bool cmp(const node & p1, const node& p2) { if (p1.val > p2.val || (p1.val == p2.val&&p1.num > p1.num)) return true; else return false; } int main() { int n, m; cin >> n >> m; multiset<int> D; for (int i = 0; i<n; i++) { int t; cin >> t; D.insert(t); } vector<node> V; for (int i = 0; i<m; i++) { node temp; cin >> temp.num >> temp.val; V.emplace_back(temp); } sort(V.begin(), V.end(), cmp); long long num=0; vector<node>::iterator iter; for (int i = 0; i < m; i++) { set<int>::iterator temp; temp = D.lower_bound(V[i].num); if (temp != D.end()) { num += V[i].val; D.erase(temp); } } cout << num << endl; }