问题描述:设有n个顾客同时等待一项服务。顾客需要的服务时间为t(1≤in)共有s处可以提供此项服务。应如何安排n个顾客的服务次序,才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。
算法设计:对于给定的n个顾客需要的服务时间和s的值,计算最优服务次序。
数据输入:由文件input.txt给出输入数据。第1行有2个正整数n和s,表示有n个顾客且有s处可以提供顾客需要的服务。接下来的行中有n个正整数,表示n个顾客需要的服务时间。
结果输出:将计算的最小平均等待时间输出到文件 output.txt输出文件
输入文件示例: 输出文件示例
10 2 336
56 12 1 99 1000 234 33 55 99 812
解答思路:
将服务时间从小到大排序,并依次加入服务处排队,按排出的最优队列计算等待时间(等待时间包含服务时间)
主要步骤:
1.创建一个二维集合,根据服务处s创建对应的一维集合并添加到二位集合中
2.将已排好序的集合中的元素依次排入服务处(一维集合)
3.根据集合长度计算服务时间需要被等待多少次
主要代码:
public static int service(int s,ArrayList<Integer> time) {
int rs=0;
Collections.sort(time);
ArrayList< ArrayList<Integer>> ss = new ArrayList<>();
for(int i=1;i<=s;i++) {
ss.add(new ArrayList<Integer>());
}
// for (int in : time) {
// ss.get(time.indexOf(in)%s).add(in);
// }
for(int i = 0 ; i < time.size() ; i ++) {
ss.get(i%s).add(time.get(i));
}
int sum = 0;
for (ArrayList<Integer> arrayList : ss) {
for(int i = 0;i<arrayList.size();i++) {
sum+=arrayList.get(i)*(arrayList.size()-i);
}
}
//System.out.println(sum);
rs = sum/time.size();
return rs;
}