问题描述:
设有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
算法分析:
贪心策略:要求最优的时间,我们可以选择将服务时间进行一个升序排序,在现生活中,如果让服务时间最短的人先服务则可以使得最大化的减少总体等待时间。
数据结构:
定义三个数组
t[ ]数组表示存储顾客服务时间
sT[ ]数组表示的是存储每一位顾客所等待的时间
waitTime[ ]数组表示的是每个服务点所所以顾客等待的时间
分析图:
排序后的t[ ] = {1,12,33,55,56,99,99,234,812,1000}
等待时间sT[0] = t[0], sT[1]=t[1]
sT[0] = t[2], sT[1]=t[3] 依次类推
每一个服务点的等待时间总和就等于该服务点的每个顾客所等待的时间。waitTime[0] += sT[0],waitTime[1] += sT[1]
源代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int t[101]; //顾客服务时间数组
int sT[101]; //存储每个顾客等待的时间
int waitTime[101]; //存储当前服务处顾客等待的时间
double greedy(int *t,int s,int n) //贪心算法
{
int i = 0;
int j = 0;
while(i<n) //循环开始模拟出每个顾客等待时间以及每个服务点总的等待时间
{
sT[j] += t[i];
waitTime[j] += sT[j];
i++;
j++;
if(j == s)
{
j = 0;
}
}
double sumTime = 0;
for(int k = 0;k<s;k++)
{
sumTime += waitTime[k];
}
return sumTime/n;
}
int main()
{
int n,s;
cout<<"input n:";
cin>>n;
cout<<endl;
cout<<"请输入有多少处服务点:";
cin>>s;
cout<<endl;
memset(sT,0,sizeof(sT));
memset(waitTime,0,sizeof(waitTime));
cout<<"请输入每个顾客的服务时间:"<<endl;
for(int i = 0;i<n;i++)
{
cin>>t[i];
}
sort(t,t+n);
cout<<"顾客最优服务次序为:"<<endl;
for(int i = 0;i<n;i++)
{
int flag = 0;
if(flag == 9)
{
cout<<t[i];
break;
}
cout<<t[i]<<"->";
flag++;
}
cout<<endl;
cout<<"顾客最优服务时间:"<<greedy(t,s,n)<<endl;
return 0;
}