————————————————————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;
}