1. 问题描述:
1)设有 n 个顾客同时等待一项服务,顾客i需要的服务时间为 ti ,i = 1,2,...,n。从 0 时刻安排任务。
2)一个顾客的等待时间从 0 时刻开始计算,直到完成对他服务的时刻终止。
3)问应该怎样安排 n 个顾客的服务次序使得总的等待时间(每个顾客等待时间的总和)最少?
2. 问题分析:
1)为了让顾客等待的总时间最少,那么就需要以:顾客所需服务时间最少,作为贪婪标准。即:要求服务时间最短第一个被服务,第二短的次之,以此类推。这很像操作系统里的SJF(短作业优先)调度算法。
2)因此,我们可以先对顾客所需的服务服务时长进行从小到大排序,最后用贪婪的思想进行选择。
C语言实现:
// Hello, i'm JJU-干干 /* ++++++++++++++++++++++++++++++++++++++++++++++++ + + 思想:为了总等待时间最少,当然是用时少的服务先执行, + 用时长的后执行,类似于操作系统的SJF。 + 所以要先对顾客的服务时长进行从小到大排序。 + 注意:这里的等待时间是从0时刻开始到顾客服务完成时刻的 + 时间间隔。 + ++++++++++++++++++++++++++++++++++++++++++++++++ */ #include<stdio.h> #include<stdlib.h> #define size 100 void Quick_Sort(int *a, int l, int r) //用快速排序的方法对服务时长进行排序 { if(l<r) { int i=l, j=r; int x=a[l]; while(i<j) { while(i<j && a[j]>=x) j--; if(i<j) a[i++]=a[j]; while(i<j && a[i]<x) i++; if(i<j) a[j--]=a[i]; } a[i] = x; Quick_Sort(a,l,i-1); Quick_Sort(a,i+1,r); } } void Greedy(int n, int *t) { int wait_time=0,wait_stime=0; // wait_time: 每个顾客的等待时间,wait_stime: 顾客总的等待时间 int i; for(i=1;i<=n;i++) { wait_time = wait_time+t[i]; //等待时间 = 0 时刻到顾客服务完成时刻的时间间隔 wait_stime+=wait_time; // 总的等待时间更新:加上新的服务顾客的等待时间 printf("\n第%d个被选择服务的顾客的服务时间为:%d,等待时间为:%d",i,t[i],wait_time); } printf("\n顾客等待总时间为:%d\n", wait_stime); } void main() { int wait_stime=0,wait_time=0; int i,n; int t[size]; int l,r; printf("请输入服务总人数:"); scanf("%d",&n); printf("\n请输入%d人各自的服务时间:",n); for(i=1; i<=n ;i++) scanf("%d",&t[i]); l=1; //快速排序的左边界 r=n; //快速排序的右边界 Quick_Sort(t,l,r); Greedy(n,t); system("pause"); }
运行结果:
Python实现:
# Hello, i'm JJU-干干 def Quick_Sort(a,l,r): if(l<r): i = l j = r x = a[l] while i<j: while i<j and a[j]>=x: j-=1 if i<j: a[i] = a[j] i+=1 while i<j and a[i]<x: i+=1 if i<j: a[j] = a[i] j-=1 a[i] = x Quick_Sort(a,l,i-1) Quick_Sort(a,i+1,r) return a def Greedy(n,t): wait_time = 0 wait_stime = 0 for i in range(0,n): wait_time = wait_time + t[i] wait_stime = wait_stime + wait_time print("第{0}个被选择服务的顾客的服务时间为:{1}, 等待时间为:{2}" .format(i,t[i],wait_time)) print("顾客等待的总时间为:{0}".format(wait_stime)) if __name__ == '__main__': n = eval(input("请输入要服务顾客的总人数:")) t = list(eval(input("请输入顾客各自所需的服务时间:"))) l=0 r=n-1 t = Quick_Sort(t,l,r) Greedy(n,t)
运行结果: