C++实现最优排队顺序,最小化平均等待时间(不使用vector)
首先,根据输入的打水时间,我们可以创建一个数组来存储每个人的打水时间。\n\n接下来,我们需要计算每个人的等待时间。等待时间可以定义为前面所有人的打水时间之和。\n\n然后,我们可以使用递归来尝试不同的排队顺序。我们可以从第一个人开始,依次尝试将每个人放到第一个位置,并将剩余的人进行递归排队。在递归过程中,我们可以计算每个排队顺序的平均等待时间,并记录最小的平均等待时间和对应的排队顺序。\n\n最后,我们输出最小平均等待时间对应的排队顺序。\n\n以下是完整的C++代码实现:\n\ncpp\n#include <iostream>\n#include <algorithm>\nusing namespace std;\n\ndouble minAvgTime = 1e9; // 初始化最小平均等待时间为一个极大值\nint bestOrder[1000]; // 最优排队顺序\n\nvoid calculateAvgTime(int order[], int time[], int n) {\n double avgTime = 0.0;\n double waitTime = 0.0;\n\n for (int i = 0; i < n; i++) {\n avgTime += waitTime;\n waitTime += time[order[i]]; // 更新当前人的等待时间\n }\n\n avgTime /= n;\n\n if (avgTime < minAvgTime) {\n minAvgTime = avgTime;\n for (int i = 0; i < n; i++) {\n bestOrder[i] = order[i];\n }\n }\n}\n\nvoid permutation(int order[], bool chosen[], int time[], int n, int index) {\n if (index == n) {\n calculateAvgTime(order, time, n);\n return;\n }\n\n for (int i = 0; i < n; i++) {\n if (!chosen[i]) {\n chosen[i] = true;\n order[index] = i;\n permutation(order, chosen, time, n, index + 1);\n chosen[i] = false;\n }\n }\n}\n\nint main() {\n int n;\n cin >> n;\n\n int time[1000];\n for (int i = 0; i < n; i++) {\n cin >> time[i];\n }\n\n int order[1000];\n bool chosen[1000] = {false};\n\n permutation(order, chosen, time, n, 0);\n\n for (int i = 0; i < n; i++) {\n cout << bestOrder[i] + 1 << " ";\n }\n cout << endl;\n cout.precision(2);\n cout << fixed << minAvgTime << endl;\n\n return 0;\n}\n\n\n在上述代码中,我们使用了递归来实现排队顺序的尝试。在每次尝试时,我们使用了一个数组chosen来记录哪些人已经被选择过了,避免重复选择。\n\n在计算每个排队顺序的平均等待时间时,我们使用了两个变量avgTime和waitTime。avgTime用于累加每个人的等待时间,waitTime用于记录当前人的等待时间。\n\n最后,我们通过设置输出精度为两位小数,使用cout.precision(2)和cout << fixed来输出最小平均等待时间。
原文地址: https://www.cveoy.top/t/topic/pQ0C 著作权归作者所有。请勿转载和采集!