C++实现 多处最优服务次序问题

题目:设有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 
#include
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;
}

你可能感兴趣的:(解决问题,贪心算法,c++,算法)