首页 > 试题广场 >

银行取款排队模拟 ,请写程序计算所有客户的平均等待时间。

[问答题]
银行取款排队模拟
假设银行有4个柜台,假设某天有200位客户来办理业务,每个客户到达银行的时间和业务处理时间分别用两个数组arrive_time 和 process_time 来描述。
请写程序计算所有客户的平均等待时间,假设每个客户在去到营业部之后先拿号排队,然后在任意一个柜台有空闲的时候,号码数最小的客户上去办理,假设所有的客户拿到号码之后不会因为银行众所周知的慢而失去耐心走掉。
推荐
int arrive_time[] = new int[] { 10, 12, 15, 17, 18, 19, 19, 20, 25 };
int process_time[] = new int[] { 1, 18, 10, 19, 16, 8, 6, 7, 3 };
int total = 0, lastTime = 0;
int atms[] = new int[] { 0, 0, 0, 0 };
for (int i = 0; i < process_time.length; i++) {
        int time = arrive_time[i] - lastTime;
        for (int j = 0; j < atms.length; j++) {
            atms[j] -= time;
    }
    lastTime = arrive_time[i];
    boolean wait = true;
    for (int j = 0; j < atms.length; j++) {
        if (atms[j] <= 0) {
            atms[j] = process_time[i];
            wait = false;
            break;
        }
    }
    if (wait) {
        int temp = atms[0];
        for (int j = 0; j < atms.length; j++) {
            for (int j2 = j + 1; j2 < atms.length; j2++) {
                if (atms[j2] < atms[j]) {
                    temp = atms[j2];
                    atms[j2] = atms[j];
                    atms[j] = temp;
        }
    }
}
        total += atms[0];
        atms[0] += process_time[i];
    }
}
System.out.println((double) total / arrive_time.length);
编辑于 2015-02-06 10:40:56 回复(0)
/**
 * o(n)的解决方法,经测试和标准答案的结果是一样的
 * 模拟银行业务场景:
 * 用一个优先队列保存四个元素,四个元素为正在进行的任务执行完成的时间
 * (优先队列会按照任务结束的时间排序, 从队列取到的第一个任务总是最先完成的那个)
 * 用一个变量保存总的等待时间
 *
 * 先往优先队列放入4个任务,这4个任务的等待时间为0,所以优先队列的4个值为4个任务对应的到达时间和执行时间之和,
 * 再把剩下的任务一个个加入优先队列,对于这个要加入的任务,他的等待时间为优先队列的第一个元素(四个任务中最先完成的任务)
 * 的值减去当前任务的开始时间,所以这个要加入的任务的完成时间为“他的等待时间 + 任务到达时间 + 任务执行时间”
 * 依次遍历完所有的任务,得到最终等待时间
 * @param arrive_time
 * @param process_time
 * @return
 */
private static double solution(int[] arrive_time, int[] process_time) {
    PriorityQueue<Integer> processing = new PriorityQueue<>();
    for (int i = 0; i < 4; i++) {
        processing.add(arrive_time[i] + process_time[i]);
    }

    int totalWaitTime = 0;
    int waitTime;
    for (int i = 4; i < arrive_time.length; i++) {
        waitTime = processing.peek() - arrive_time[i];
        //waitTime为负数时不需要等待
        waitTime = Math.max(waitTime, 0);
        totalWaitTime += waitTime;
        processing.poll();
        processing.add(arrive_time[i] + process_time[i] + waitTime);
    }
    return totalWaitTime * 1.0 / arrive_time.length;
}

编辑于 2017-07-01 13:08:06 回复(0)
t =arrive_time[0]
user_num =200
p =0
window_num =4
windows =[(-1, 0)]*window_num # user_id, finish_time, -1 stands for nobody here
wait_q =[]
wait_time_sum =0.0
whilep<user_num: #60*60*24 times at most
    whilet==arrive_time[p]:
         wait_q.append(p)
         p +=1
    fori inrange(window_num):
        user_id, finish_time =windows[i]
        iffinish_time==t:
            wait_time_sum +=t-process_time[user_id]-arrive_time[user_id]
            windows[i] =(-1, 0)
        ifwindows[i][0]==-1:
            next_user =wait_q.pop(0)
            windows[i] =(next_user, t+process_time[next_user])
    t +=1
printwait_time_sum/len(arrive_time)

发表于 2016-08-14 20:03:56 回复(0)
/*
模拟银行业务,知道所有客户到达时间和办理业务所需时间,计算客户平均等待时间,其关键点在于
1.记录4个队列为空的时间,知道哪个队列最先为空以及为空的时间time;
2.最早到达但尚未办理业务的客户到达时间和1中的time比较,当前者早于或者晚于后者时分两种情况计算当前客户离开时间;
*/
#include <stdio.h>
#include <malloc.h>
#include <iostream>

struct Person
{
int arrivedT;
int duringT;
int leftT;
};


#define  NUM 200
int arrArray[NUM];//记录到达时间
int durArray[NUM];//办理业务时间
Person personArray[NUM];//按照到达时间存储客户信息
int startedTime[4];//各队列办理下一次业务时间

//查找最先办理完业务的队列以及时间
void FindNextQueue(int &qIndex, int &time);
int main()
{
/*
读取数据
*/
for(int i=0; i<NUM; I++)
      cin>>arrArray[i];   
for(int i=0; i<NUM; I++)
      cin>>durArray [i];   
/*
构造personArray
*/
for (int i=0; i<NUM; i++)
{
Person p;
p.arrivedT = arrArray[i];
p.duringT = durArray[i];
personArray[i] = p;
//PushQueue(qArray[0], p);
}

/*
所有客户办理业务,计算离开时间
*/
for (int i=1; i<5; i++)
startedTime[i] = 0;

int qIndex, time;
int count = 0;
while(count<NUM)
{
Person p = personArray[count];
//查找最早办理完业务的队列
FindNextQueue(qIndex, time);
if(p.arrivedT>=time)//可以直接办理业务,不需要等待
{
p.leftT = p.arrivedT+p.duringT;
//PushQueue(qArray[qIndex], p.leftT);
startedTime[qIndex] = p.leftT;
//PushQueue(qArray[0], p);
personArray[count] = p;
}
else//需要等待
{
p.leftT = time + p.duringT;
//PushQueue(qArray[qIndex], p.leftT);
startedTime[qIndex] = p.leftT;
//PushQueue(qArray[0], p);
personArray[count] = p;
}
count++;
}

/*
计算平均等待时间
*/
float waitedTime = 0;
for (int i=0; i<NUM; i++)
{
Person p = personArray[i];
waitedTime += p.leftT-p.arrivedT-p.duringT;
}
waitedTime /= float(NUM);

std::cout<<waitedTime<<endl;

}

//查找最先办理完业务的队列以及时间
void FindNextQueue( int &qIndex, int &time )
{
qIndex = 1;
time = startedTime[1];
for (int i=2; i<5; i++)
{
if(startedTime[i]<time)
{
qIndex = i;
time = startedTime[i];
}
}
}
发表于 2016-07-18 15:18:19 回复(1)
float all_ process_time=0;
float all_arrive_time=0;
for(int i=0;i<200;i++){
    all_process_time+=process_time[i];
    all_arrive_time+=arrive_time[i];
}
float wait_time=(all_ process_time-all_ arrive_time)/200;
发表于 2014-11-08 14:54:21 回复(1)
OC代码解题

- (void)viewDidLoad {

[super viewDidLoad];


NSArray *arrive_time = @[@1,@2,@3,@4,@4,@8];

NSArray *process_time = @[@50,@20,@11,@25,@30,@40];

if (arrive_time.count < 4) {

NSLog(@"等待时间为:%d",0);

return;

}


NSMutableArray *array = [NSMutableArray array];

for (int i = 0; i < 4; i++) {

NSInteger total = [arrive_time[i] integerValue] + [process_time[i] integerValue];

[array addObject:[NSNumber numberWithInteger:total]];

}

NSInteger totalWaiteTime = 0;

NSInteger waiteTime = 0;


for (int i = 4; i < arrive_time.count; i++) {

NSInteger min = [self fetchMinArray:array];

NSInteger processTime = [array[min] integerValue];

waiteTime = processTime - [arrive_time[i] integerValue];

waiteTime = waiteTime <= 0 ? 0 : waiteTime;

totalWaiteTime +=waiteTime;

array[min] = [NSNumber numberWithInteger:[array[min] integerValue] + [process_time[i] integerValue]];

waiteTime = 0;

}


NSLog(@"等待时间为:%lu",totalWaiteTime/arrive_time.count);

}


- (NSInteger)fetchMinArray:(NSArray *)minArray {

NSInteger min = 0;

for (NSInteger i = 1; i < minArray.count; i++) {

if ([minArray[min] integerValue] > [minArray[i] integerValue]) {

min =  i;

}

}

return min;

}



编辑于 2019-01-07 20:24:41 回复(0)
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

double countTheAveTime(vector<double> arrive_time,vector<double> process_time,int n){
sort(arrive_time.begin(),arrive_time.end());
double min_time = arrive_time[0];
double window1 = min_time, window2 = min_time, window3 = min_time, window4 = min_time;
vector<double> window;
window.push_back(window1);
window.push_back(window2);
window.push_back(window3);
window.push_back(window4);

vector<double> wait_time;

for (int i = 1; i <= n; i++)
{
sort(window.begin(), window.end());
double min = window[0];

double wait = min - arrive_time[i - 1] ;

wait_time.push_back(wait);
window[0] += process_time[i-1];
}
double total_time=0;
for (int i = 0; i < n; i++)
{
total_time += wait_time[i];
}
double average_time = total_time / n;
return average_time;
}

int main(){
vector<double> arrive_time;
vector<double> process_time;
int n;
cin >> n;

arrive_time.push_back(1);
arrive_time.push_back(1);
	arrive_time.push_back(1);
arrive_time.push_back(1);
arrive_time.push_back(1);

process_time.push_back(3);
process_time.push_back(3);
process_time.push_back(4);
process_time.push_back(2);
process_time.push_back(3);
double result = countTheAveTime(arrive_time,process_time,n);
cout << result << endl;
system("pause");
return 0;
}
发表于 2016-09-07 21:09:18 回复(0)


发表于 2014-12-24 15:50:13 回复(0)