贪心算法之多处最优服务次序问题

问题描述:
  设有n 个顾客同时等待一项服务。顾客i需要的服务时间为ti ,1<= i <= n。共有s 处可以提供此项服务。应如何安排n 个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。
编程任务:
  对于给定的n个顾客需要的服务时间和s的值,编程计算最优服务次序。
数据输入:
  第一行有2 个正整数n 和s,表示有n 个顾客且有s 处可以提供顾客需要的服务。接下来的1 行中,有n个正整数,表示n个顾客需要的服务时间。
结果输出:
  最小平均等待时间。
输入示例
10 2
56 12 1 99 1000 234 33 55 99 812
输出示例

336

 问题分析:

         A[n] = {56,12,1,99,1000,234,33,55,99,812}

                        /  B[0]   1    33   56   99    812

    s处服务点

                       \   B[1]  12   55   99  234  1000

   等待时间B[0] = A[0]                                 C[0] = B[0] = A[0]

                   B[1] = A[1]                                 C[1] = B[1] = A[1]  

                   B[0] = A[0] + A[2]                      C[0] = 2 A[0] + A[2]

                   B[1] = A[1] + A[3]                      C[1] = 2A[1] + A[3]

                    以此类推 ,原理如同最优服务次序。

                             C[0] = 5A[0] + 4 A[2] + 3A[4] +2 A[6] + A[8]

                                       C[1] = 5A[1] + 4 A[3] + 3A[5] +2 A[7] + A[9]

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#define SIZE 10  
/* 
多处最优服务次序,输入n个顾客的服务时间和s处提供此项服务。输出最小平均等待时间。 
*/  
int s,n;  
int B[SIZE];  //存储服务点  
int C[SIZE];  //存储服务等待时间  
double  greedy(int A[]);  
void sort(int A[]);  
void swap(int *a,int *b);  
  
int main()  
{  
    int i,j,temp;  
    printf("请输入顾客数目和服务点个数:\n");  
    scanf("%d %d",&n,&s);  
    int A[n];
    printf("请输入每个顾客的服务时间:\n");  
    for(i = 0;i < n;i++)  
    {  
        scanf("%d",&A[i]);  
    } 
    
	for(i=0;i<n;i++){ //按服务时间由小到大排列  
       for(j=i+1;j<n;j++){
            if(A[i]>A[j]){
                temp=A[i];A[i]=A[j];A[j]=temp;
            }
        }
    } 
    printf("最小平均等待时间:%lf",greedy(A));  
    return 0;  
}  
  
double greedy(int A[])  
{  
    int i= 0 ,j = 0;  
    while(i < n)  
    {  
        B[j] += A[i];  
        C[j] += B[j];      //C[i] 存储每个顾客的等待时间  
        i++;  
        j++;  
        if(j == s)         //安排s个服务点的活动  
        {  
            j = 0;  
        }  
    }  
    double t=0;
    for(i = 0;i < s;i++)  
        t += C[i];      //每个服务点的等待时间累加  
    return  t/n;  
} 

猜你喜欢

转载自blog.csdn.net/qq_40685275/article/details/80246012