题目:设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti,1<=ti<=n。共有s处可以提供此项服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小? 平均等待时间是n个顾客等待服务时间的总和除以n。
输入示例:
n = 10, s = 2
56 12 1 99 1000 234 33 55 99 812
output: 336
注意:在这个问题里面,将服务时间与等待时间一起算作等待时间,比如服务次序:
A B C
10 20 25
A的等待时间为10
B的等待时间为30
C的等待时间为55
这与我们通常理解的等待时间和服务时间不一样
这里使用贪心算法进行解决,步步最优以到达整体最优
- 先将服务时间由小到大排序
- 选出当前等待时间最小的服务处,将当前服务时间最小的加到这个服务处
- 重复上一步直到所有顾客都安排完
#include <iostream>
#include<algorithm>
using namespace std;
int SelectMin(int* wait,int s) { //该函数实现 选出当前等待时间最小的服务处
int min = wait[0];
int index = 0;
for (int i = 0; i < s; i++) {
if (min > wait[i]) {
min = wait[i];
index = i;
}
}
return index;
}
int Greedy(int* wait, int *arr, int n,int s) { //实现顾客的安排、总等待时间的计算
int sum = 0;
int index;
for (int i = 0; i < n; i++) {
index = SelectMin(wait, s);
wait[index] += arr[i];
sum += wait[index];
}
return sum / n; //返回平均等待时间
}
int main()
{
int n, s, res;
cout << "Input N and S: ";
cin >> n >> s;
int* arr = new int[n];
int* wait = new int[s]();
cout << "Input waiting time: ";
for (int i = 0; i < n; i++)
cin >> arr[i];
sort(arr, arr + n);
res= Greedy(wait, arr, n, s);
cout << res;
delete[] arr;
delete[] wait;
return 0;
}