贪心算法☞最优服务次序&多处服务最优次序

————————————————————Sun—————————————————————————

1.最优服务次序

  问题描述:

          n个顾客同时等待一项服务,应如何安排顾客等待次序才能使平均等待时间最小?

 问题分析:

         贪服务时间最小的顾客先服务,第一位顾客服务时,每一位顾客都等待A[0]个时间;第二个时,有n-1位顾客等待;以此类推,第i个顾客服务时,有n- i个顾客在等待中,由此得出公式   总的等待时间 time += (n – i) * A [ i ] ,最小平均等待时间为 time / n。

  代码:

#include <stdio.h>
#include <string.h>
#define SIZE 10
int A[SIZE];
void sort(int A[],int n);
double greedy(int A[],int n);
void swap(int * a,int * b);

int  main()
{
        int n,i;// n个顾客
        printf("请输入顾客数:\n");
        scanf("%d",&n);
        printf("请输入每个顾客的服务时间:\n");
        for(i = 1;i<=n;i++)
        {
            printf("No.%d\n",i);
            scanf("%d",&A[i-1]);
       }
       sort(A,n);
       printf("最小平均等待时间:%.2f",greedy(A,n));
       return 0;
}

double greedy(int A[],int n)
{
    int i,time = 0;
    double t = 0;//最小平均等待时间
    for(i = 0;i < n;i++)
    {
        time = time +(n-i)*A[i];
    }
    t = time/n;
    return t;
}
void sort(int A[],int n)
{
    int i,j;
    for(i = 0;i < n;i++)
    {
        for(j = i+1;j < n;j++)
        {
            if(A[i] > A[j])
            swap(&A[i],&A[j]);
        }
    }
}
void swap(int *a,int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
 

测试: 《贪心算法☞最优服务次序&多处服务最优次序》

2.多处最优服务次序
  问题描述:

          n个顾客等待s项服务,应如何安排顾客等待次序才能使平均等待时间最小?

 问题分析:

         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];  //存储服务等待时间
int  greedy(int A[],int n);
void sort(int A[],int n);
void swap(int *a,int *b);

int main()
{
    int i,A[n];
    printf("请输入顾客数目和服务点个数:\n");
    scanf("%d %d",&n,&s);
    printf("请输入每个顾客的服务时间:\n");
    for(i = 0;i < n;i++)
    {
        scanf("%d",&A[i]);
    }
    sort(A);
    printf("最小平均等待时间:%d",greedy(A));
    return 0;
}

void sort(int A[])   //按服务时间由小到大排列
{
    int i,j;
    for(i = 0;i < n;i++)
    {
        for(j = i+1;j < n;j++)
        {
            if(A[i] > A[j])
            swap(&A[i],&A[j]);
        }
    }
}
void swap(int *a,int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

int greedy(int A[])
{
    int i= 0 ,t,j = 0;
    while(i < n)
    {
        B[j] += A[i];
        C[j] += B[j];      //C[i] 存储每个顾客的等待时间
        i++;
        j++;
        if(j == s)         //安排s个服务点的活动
        {
            j = 0;
        }
    }
    for(i = 0;i < s;i++)
        t += C[i];      //每个服务点的等待时间累加
    return  t/=n;
}


    原文作者:贪心算法
    原文地址: https://blog.csdn.net/qq_31992913/article/details/51307622
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞