1. 程式人生 > >演算法分析與設計之多處最優服務次序問題2

演算法分析與設計之多處最優服務次序問題2

¢ 設有n個顧客同時等待一項服務,顧客i需要的服務時間為ti,1≤i≤n,共有s處可以提供此項服務。應如何安排n個顧客的服務次序才能使平均等待時間達到最小?平均等待時間是n個顧客等待服務時間的總和除以n。

¢ 給定的n個顧客需要的服務時間和s的值,程式設計計算最優服務次序。

¢ 輸入

第一行有2個正整數n和s,表示有n個顧客且有s處可以提供顧客需要的服務。接下來的1行中,有n個正整數,表示n個顧客需要的服務時間。

¢ 輸出

最小平均等待時間,輸出保留3位小數。

輸入樣例

10 2

56 12 1 99 1000 234 33 55 99 812

輸出樣例

336.00


#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; int main() { int i,n,j,k,minx; int s; double t; int a[10005],b[1005]; while(cin>>n>>s) // 輸入顧客數量和可供等待的工位 { for(i=0; i<n; i++) cin
>>a[i]; //輸入顧客使用時間陣列 sort(a,a+n); //將陣列從小到大排序 memset(b,0,sizeof(b)); // 將b中的陣列初始化為0 for(i=0; i<n; i++) //遍歷顧客的等待時間 { minx=0x7fffffff; //定義一個非常大的數 k=0; // for(j=0; j<s; j++) //有幾個工位 進行幾次迴圈 { if(minx>b[j]) //
這個和上個小的進行對比 { minx=b[j]; //記錄小的 k=j; //記錄小的對應的工位 } } b[k]+=a[i]; // b[k] = b[k] + a[i] 記錄每個工位的總時間 a[i]=b[k]; // 把每個工位的時間賦給對應顧客 形成 顧客總時間陣列 } t=0; for(i=0; i<n; i++) // 計算顧客平均等待時間 t+=a[i]; t/=n; printf("%d\n",(int)(t)); } return 0; }