题目描述:
设有n个顾客同时等待一项服务,顾客i需要的服务时间为ti,1≤i≤n,共有s处可以提供此项服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。
#include<bits/stdc++.h>
using namespace std;
//总体核心思路:每个顾客的等待时间等于自己需要的服务时间和他前面的所有顾客的服务时间的综合
int main(){//只有一个服务点的情况
int n;//n为顾客人数
int s;//s表示服务点的个数
cout<<"请输入顾客人数"<<endl;
cin>>n;
cout<<"请输入服务点个数:"<<endl;
cin>>s;
vector<int> a(n,0); //vector容器现在存储的是服务时间的int类型数组
vector<int> line(s,0); //服务点
cout<<"请输入顾客的服务时间:"<<endl;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a.begin(),a.end()); //对a容器里的数据进行排序(最短作业优先,也就是贪心算法)
vector<int> sum(1,0); //sum用于存储总的等待时间
for(int i=0;i<n;i++){
line[i%s]+=a[i]; //每个服务点上顾客的等待时间,也就是当前顾客的等待时间
sum[0]+=line[i%s]; //更新sum值
}
int result=sum[0];//计算出最小平均等待时间
result=result/s;
cout<<"平均最短等待时间为:"<<result;
}
核心问题:
要做一个服务点的很简单,只需要用一个vector把数据存起来再累加就好了,麻烦的是有多处服务点,就得用两个vector来体现二维,这里很巧妙的是用一个vector line()来存每一个服务点上的顾客需要等待的时间,最后只要把这个line里的数据汇总到另一个vector sum()里把数据拿出来做最后的平均计算就好了。
看到网上很多C写的代码不够简洁,C++就不用单独写一个排序的算法,用现成的sort(begin(),end();)就行。
望采纳,谢谢。