C++题目描述可多饭店本月新收到若干个不同的菜单制作这些菜单上的菜的难易程度为一级、二级、三级…同样能够制作不同难度菜单的厨师也被分为若干星级并且 x 星级的厨师能够完成 x 级别以下的所有菜单上的菜。现有 m 个菜单需要制作n 个空闲厨师请问能否完成所有菜单呢?如果可以最少的花费是多少呢?注:每个厨师当月只能完成一份菜单厨师的工资就是厨师的星级。输入描述输入第一行两个整数 m 和 n分别表示需要
题目要求判断是否能够完成所有菜单,并计算完成所有菜单的最少花费。
首先,我们需要将菜单和厨师按照难易程度和星级进行排序。可以使用两个vector来存储菜单和厨师,并使用sort函数对它们进行排序。
然后,我们可以使用贪心算法来分配菜单给厨师。从难度最低的菜单开始,依次分配给星级最低的厨师。如果某个厨师的星级能够完成当前菜单的难度级别,就将该菜单分配给该厨师,并更新该厨师的花费。如果所有厨师都无法完成当前菜单的难度级别,就输出"Failed"。
最后,输出最小花费和每个菜单对应的厨师级别。
以下是完整的C++代码实现:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Menu {
int level;
int chefLevel;
};
bool compareMenu(Menu a, Menu b) {
return a.level < b.level;
}
bool compareChef(int a, int b) {
return a < b;
}
int main() {
int m, n;
cin >> m >> n;
vector<Menu> menus(m);
for (int i = 0; i < m; i++) {
cin >> menus[i].level;
}
vector<int> chefs(n);
for (int i = 0; i < n; i++) {
cin >> chefs[i];
}
sort(menus.begin(), menus.end(), compareMenu);
sort(chefs.begin(), chefs.end(), compareChef);
int cost = 0;
vector<pair<int, int>> assignments;
int menuIndex = 0;
int chefIndex = 0;
while (menuIndex < m && chefIndex < n) {
if (menus[menuIndex].level <= chefs[chefIndex]) {
cost += chefs[chefIndex];
assignments.push_back(make_pair(menus[menuIndex].level, chefs[chefIndex]));
menuIndex++;
}
chefIndex++;
}
if (menuIndex < m) {
cout << "Failed" << endl;
} else {
cout << cost << endl;
for (int i = 0; i < m; i++) {
cout << assignments[i].first << " " << assignments[i].second << endl;
}
}
return 0;
}
该代码首先读入菜单数量m和厨师数量n,然后分别读入菜单难度级别和厨师星级。接下来,对菜单和厨师进行排序。然后,使用贪心算法将菜单分配给厨师,并计算花费。最后,输出最小花费和每个菜单对应的厨师级别。
时间复杂度分析: 排序菜单和厨师的时间复杂度为O(mlogm + nlogn)。分配菜单给厨师的时间复杂度为O(m + n)。因此,总的时间复杂度为O(mlogm + nlogn)
原文地址: http://www.cveoy.top/t/topic/h4tS 著作权归作者所有。请勿转载和采集!