题目说明:银行排队,有K个窗口,N个客户排成一队,当有窗口空闲时可以被服务。输入每个客户的到达时间和服务持续时间,输出每个客户的平均等待时间。
思路:先按照时间顺序排序所有客户,用一个vector存放正在窗口的客户的离开时间。当vector的长度小于K时,放入一个元素;若等于K,说明窗口满,推出离开时间最早的元素。
#include <iostream>
#include <fstream>
#include<string.h>
#include <vector>
#include <algorithm>
using namespace std;
#define START 8*60*60
#define END 17*60*60
/*
by dayu
*/
int N,K;
struct Customer{
char arr[10];
int pro;
int arrsec;
int waitsec;
}ct[10005];
int validN;//有效人数
vector<int> leave;//离开时间
bool cmp(const Customer &a,const Customer &b){
if(strcmp(a.arr,b.arr)<0)
return true;
else
return false;
}
int main(void){
cin>>N>>K;
for(int i=0;i<N;i++){
cin>>ct[i].arr>>ct[i].pro;
int hour=(ct[i].arr[0]-'0')*10+(ct[i].arr[1]-'0');
int min=(ct[i].arr[3]-'0')*10+(ct[i].arr[4]-'0');
int sec=(ct[i].arr[6]-'0')*10+(ct[i].arr[7]-'0');
ct[i].arrsec=hour*60*60+min*60+sec;//到达时间(以秒为单位)
}
validN=N;
sort(ct,ct+N,cmp);//按照到达时间升序排序
int leavesec=START;//上一个客户的离开时间
for(int i=0;i<N;i++){
//到达时间大于17:00:00 无效
if(ct[i].arrsec>END){
ct[i].waitsec=0;
validN--;
continue;
}
//窗口未满,进一人
if(leave.size()<K){
//计算等待时间
if(ct[i].arrsec>leavesec){
ct[i].waitsec=0;
}
else{
ct[i].waitsec=leavesec-ct[i].arrsec;
}
//计算离开时间并加入容器
leave.push_back(ct[i].arrsec+ct[i].waitsec+ct[i].pro*60);
}
//窗口满,删除离开时间最早的
if(leave.size()==K){
sort(leave.begin(),leave.end(),greater<int>());//升序排列
leavesec=leave.back();
leave.pop_back();
}
}
//计算总等待时间和平均等待时间
int total=0;
float average;
for(int i=0;i<N;i++){
total+=ct[i].waitsec;
}
average=total/60.0/validN;
printf("%.1f\n",average);
return 0;
}