题目:PAT A 1017
题目大意
给出N
个客户的到达时间,银行有K
个窗口,银行在8:00
上班,在17:00
后到达的客户不服务,也不计算计算到平均时间。请问平均等待时间
解题思路
- 根据客户达到的时间进行排序。使用
window
数组模拟银行的窗口。每次分配给你用户的窗口的是时间最小的。
#include<bits/stdc++.h>
using namespace std;
struct Customer{
int h,m,s,p;
int time;
};
int n,k;
int startime=8*60*60;
int endtime=17*60*60;
int window[101];
bool cmp(const Customer &a,const Customer &b){
return a.time<b.time;
}
vector<Customer>customer;
int main(){
scanf("%d%d",&n,&k);
customer.resize(n);
for(int i=0;i<101;i++) window[i]=startime;
for(int i=0;i<n;++i){
scanf("%d:%d:%d %d",&customer[i].h,&customer[i].m,&customer[i].s,&customer[i].p);
customer[i].time=customer[i].h*60*60+customer[i].m*60+customer[i].s;
}
sort(customer.begin(),customer.end(),cmp);
double total=0;
int cnt=0;
for(int i=0;i<n;++i){
int push=0;
if(customer[i].time>endtime) break;
for(int j=0;j<k;++j){
if(window[j]<window[push]) push=j;
}
++cnt;
if(customer[i].time>=window[push]){//窗口空闲,不需要等待
window[push]=customer[i].time+customer[i].p*60;
}else{//窗口无空闲,需要等待
total+=window[push]-customer[i].time;
window[push]=window[push]+customer[i].p*60;
}
}
printf("%.1f\n",total/60.0/cnt);
return 0;
}