某银行有4个柜台,假设某天有若干位客户来办理业务,每个客户到达银行的时间和取款需要的 时间分别用两个数组arrvie_time(已经按到达时间排序)和process_time来描述。假设每个客户在取款之前先拿号排队,然后在任意一个 柜台有空闲的时候,号码数最小的客户上去办理,假设所有的客户拿到号码之后都不会失去耐心走掉 , 请写程序计算所有客户的平均等待时间。
那么这道题的解决思路是怎样的呢,前四个不用等待有空闲柜台,第五个客户需要等待,必须等到第一个先办理完取款的人离开才能办理,那么他的等待时间就是第一个办理完人的到达时间+办理时间-自身的到达时间。后面的依次类推。如果前面的人有等待的时间,还要把这个时间算进去。 每循环一次,都需要将办理柜台取款的人的办理后的时间进行重新排序计算出最先办理完取款的人。 排序这里用的是java的Comparator接口 那么就需要两个数组,一个存所有客户按到达时间排序的数组,一个存办理取款的人的数组。每当办理取款的数组排序完毕后就相当于有人已经取完款了,这时最新办完取款的客户移除,将下一个客户添加到柜台取款的数组中,随后进行排序。 最后将所有客户的等待时间进行算数平均值计算。
public class BankSort {
public static void main(String[] args) {
int gt=4;
int[] arrivetime={1,2,3,4,4,8};
int[] processtime={50,20,11,25,30,40};
Person[] people=new Person[arrivetime.length];
for(int i=0;i<arrivetime.length;i++){
people[i]=new Person(i, arrivetime[i], processtime[i], 0);
}
init(people);
Person[] gtpeople=Arrays.copyOfRange(people, 0, gt);
for(int i=gt;i<people.length;i++){
sort(people);
people[i].waittime=gtpeople[0].arrivetime+gtpeople[0].processtime+gtpeople[0].waittime-people[i].arrivetime;
gtpeople[0]=people[i];
}
int alltime=0;
for(int i=0;i<people.length;i++){
alltime+=people[i].waittime;
}
float avgtime=alltime/people.length;
System.out.println(avgtime);
}
public static class sortpeople implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return o1.arrivetime+o1.processtime+o1.waittime-o2.arrivetime-o2.processtime-o2.waittime;
}
}
public static class Initpeople implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return o1.arrivetime-o2.arrivetime;
}
}
public static void init(Person[] people)
{Initpeople ins=new Initpeople();
Arrays.sort(people,ins);
}
public static void sort(Person[] people)
{sortpeople sorts=new sortpeople();
Arrays.sort(people,sorts);
}
}