多处最优问题
来源:互联网 发布:大数据解决方案供应商 编辑:程序博客网 时间:2024/06/08 08:55
算法实现题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;
}
}
}
(注解:很多人会对这道题中平均等待服务时间不理解,下面我解释一下变做出这道题的具体运算过程.
一个顾客的等待服务时间是顾客的等待时间加上这个顾客的服务时间,学过操作系统的同学应该明白进程的周转时间吧, 说的好像只有顾客的等待时间而没有服务时间,这也是悲催的原因吧。
下面说下此程序的运算过程:
队列1
- 多处最优问题
- 多处最优服务次序问题
- 多处最优服务次序问题
- 多处最优服务次序问题
- 多处最优服务次序问题
- 多处最优服务次序问题
- 贪心(多处最优服务次序问题)
- 多处最优服务次序问题
- 多处最优服务次序问题(贪心策略)
- YTU.1743: 多处最优服务次序问题
- 算法学习系列(贪心算法)—多处最优服务次序问题
- 最优车皮排序问题
- 最优服务次序问题
- 水处理最优方案问题
- 【dp】最优时间表问题
- 最优程序问题
- 最优流水调度问题
- mod4最优路径问题
- JiBX初步
- JSF入门
- 黑马程序员—两种设计模式及其代码的实现—第11篇
- 用分治法输出一个一维数组中的n个不同实数间距离最小的两个实数
- 对滚动区域QScrollArea用法的摸索
- 多处最优问题
- 控制系统动态性能分析
- libxml库解析XML文件
- HTML编辑器FCKeditor使用详解
- 网球循环赛问题
- 清明节---山东又叫寒食节--吃冷食
- 使用Libxml2操作XML文档
- 数组实现队列
- Linux批量删除指令