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)
運行結果: