前言
随着计算机的不断发展,算法设计这门技术也越来越重要,很多人都开启了学习编程算法,本文就介绍了算法设计这门课中关于最优服务次序问题的基础内容。
一、问题描述
设有n 个顾客同时等待一项服务。顾客i需要的服务时间为ti, 1<=i <= n 。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n 个顾客等待服务时间的总和除以n。
二、贪心算法解析
贪心算法无非是“此时此刻的最优解问题”,以最优服务次序为例。最优服务次序问题,个人理解,就是理清里面的思路,一般都是按照从小到大的顺序排列,然后在进行依次算出等待时间,如果不止一个服务地点则进行循环算出每一个窗口的等待时间即可。
三、代码
1、C++代码
代码如下:
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a[1000],n,i,j,k;
double exam=0;
cout<<"请输入顾客个数以及分别输入他们需要的服务时间:"<<endl;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
if(a[i]>a[j])
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
}
for(i=0;i<n;i++)
exam+=a[i]*(n-i);
cout<<setprecision(2)<<fixed<<"最小平均等待时间为:"<<exam/n<<endl;
return 0;
}
实现:![](https://img-blog.csdnimg.cn/20210815103819541.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUyMTgyMTkw,size_16,color_FFFFFF,t_70)
2、C语言代码
代码如下:
#include<stdio.h>
#include<algorithm>
#define n 10
#define s 2
using namespace std;
double fun1(int *list){ //最优服务次序问题
int i,sum=0;
for(i=0;i<n;i++)
sum+=list[i]*(n-i);
return sum/(n*1.0);
}
double fun2(int *list){ //多次最优服务次序问题
int i,sum=0;
int *temp = new int[s];
for(i=0;i<s;i++){
temp[i]=0;
}
for(i=0;i<n;i++){
temp[i%s]+=list[i];
sum += temp[i%s];
}
return sum/(n*1.0);
}
int main(){
int i;
int list[n]={56,12,1,99,1000,234,33,55,99,812};
sort(list,list+n);
for(i=0;i<n;i++){
printf("%d\t",list[i]);
}
printf("\n%1f",fun1(list));
printf("\n%1f",fun2(list));
return 0;
}
实现: