算法實現題4-7 多處最優服務次序問題
問題描述:
設有n 個顧客同時等待一項服務。顧客i需要的服務時間爲ti, 1≦i ≦n 。共有s處可以提供此服務。應如何安排n個顧客的服務次序才能使平均等待時間達到最小?平均等待時間是n 個顧客等待服務時間的總和除以n。
編程任務:
對於給定的n個顧客需要的服務時間和s的值,編程計算最優服務次序。
數據輸入:
由文件input.txt給出輸入數據。第一行有2 個正整數n 和s,表示有n 個顧客且有s 處可以提供顧客需要的服務。接下來的1 行中,有n個正整數,表示n個顧客需要的服務時間。
結果輸出:
將編程計算出的最小平均等待時間輸出到文件output.txt。
輸入示例
input.txt
10 2
56 12 199 1000 234 33 55 99 812
輸出示例
output.txt
336
#include<iostream>
#include<iomanip>
usingnamespace std;
typedefstruct Job
{
int ID;
int time;
}Job;
typedefstruct JobNode
{
int ID;
int time;
JobNode *next;
}JobNode,*pJobNode;
typedefstruct Header
{
int s;
JobNode *next;
}Header,pHeader;
intmain()
{
void QuickSort(Job *job,int left,intright);
void outSort(Job *job,int n);
void display(Header *M,int m,int n);
void solve(Header *head,Job *job,intn,int m);
int m,n;
cout<<"\t\t<多處最優服務問題>\n";
cout<<"請輸入機器的數量:";
cin>>m;
Header *head= new Header[m];
cout <<"請輸入作業個數:";
cin>>n;
Job *job = new Job[n];
cout<<"\n請按序號輸入每個作業調度需要的時間:";
for(int i=0;i<n;i++)
{
cin>>job[i].time;
job[i].ID=i;
}
QuickSort(job,0,n-1);
outSort(job,n);
solve(head,job,n,m);
display(head,m,n);
cout<<endl<<endl;
return 0;
}
intSelectMin(Header *M,int m)
{
int k=0;
for(int i=1;i<m;i++)
{
if(M[i].s<M[k].s)
{
k=i;
}
}
return k;
}
voidQuickSort(Job *job,int left,int right)
{
int middle=0,i=left,j=right;
Job itemp;
middle=job[(left+right)/2].time;
do
{
while((job[i].time<middle)&&(i<right))i++;
while((job[j].time>middle)&&(j>left))j--;
if(i<=j)
{
itemp = job[j];
job[j] = job[i];
job[i] = itemp;
i++;
j--;
}
}while(i<=j);
if(left<j) QuickSort(job,left,j);
if(right>i) QuickSort(job,i,right);
}
voiddisplay(Header *M,int m,int n)
{
int *total = new int[m];
int *current= new int[m];
for(int j=0;j<m;j++)
{
total[j]=0;
}
for(j=0;j<m;j++)
{
current[j]=0;
}
double average=0;
JobNode *p;
for(int i=0;i<m;i++)
{
cout<<"\n第"<<i<<"臺機器上處理的工作序號:";
if(M[i].next == 0)
continue;
p=M[i].next;
do{
cout<<p->ID<<"\t";
current[i] =current[i]+p->time;
total[i]=total[i]+current[i];
//cout<<"("<<total[i]<<")";
p=p->next;
}while(p!=0);
}
cout<<endl;
for(j=0;j<m;j++)
{
average+=total[j];
}
cout<<"平均時間:"<<average/n;
}
voidoutSort(Job *job,int n)
{
cout<<"\n按工作時間由小到大爲:\n時間:\t";
for(int i=0;i<n;i++)
{
cout<<setw(4)<<job[i].time;
}
cout<<"\n序號:\t";
for(i=0;i<n;i++)
{
cout<<setw(4)<<job[i].ID;
}
}
voidsolve(Header *head,Job *job,int n,int m)
{
int k;
for (int i=0;i<m&&i<n;i++)
{
JobNode *jobnode = new JobNode;
jobnode->time = job[i].time;
jobnode->ID = job[i].ID;
jobnode->next= 0;
head[i].s = jobnode->time;
head[i].next=jobnode;
}
if(i<=m)
{
for(i;i<m;i++)
{
head[i].s =0;
head[i].next=0;
}
}
if(n>m)
{
for(i;i<n;i++)
{
JobNode *p;
JobNode *jobnode = newJobNode;
jobnode->time =job[i].time;
jobnode->ID = job[i].ID;
jobnode->next = 0;
k = SelectMin(head,m);
p = head[k].next;
head[k].s +=jobnode->time;
while(p->next!=0)
{
p=p->next;
}
p->next=jobnode;
}
}
}
(註解:很多人會對這道題中平均等待服務時間不理解,下面我解釋一下變做出這道題的具體運算過程.
一個顧客的等待服務時間是顧客的等待時間加上這個顧客的服務時間,學過操作系統的同學應該明白進程的週轉時間吧, 說的好像只有顧客的等待時間而沒有服務時間,這也是悲催的原因吧。
下面說下此程序的運算過程:
|