题目
分析
题意:让我们求出平均等待时间,题目给出办理人数和窗口数,银行营业的时间为早上8点到晚上17点,17点以后不再服务(17点后不算入办理人数),现给出每个顾客来的时间和办理业务的时长,每个窗口一次只能办一人的业务,根据此规则来计算平均等待时间。
解题过程
- 关键是计算出每个人的等待时间,这个等待时间实际上就是窗口办理上一个人的结束时间与等待人的到达时间之差,所以把所有人的等待时间加起来除以人数就是平均等待时间啦。
- 处理时间:因为题目是以hh:mm:ss的形式给出时间,为了方便计算,应该转换为以秒为单位的时间。
- 时间处理完后,我们可以按时间到达次序排序,window数组表示 某个窗⼝的结束时间,每⼀个客户到来的时候,选择早结束时间的窗⼝,如果早结束时间比他还早,那么他⼀来就能被服务,更新window的值;如果早结束时间⽐他晚,他需要等待,累加等待的时间,然后更新window的值。
- 请看代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct node
{
int come, time;
} tempcustomer;
bool cmp1(node a, node b)
{
return a.come < b.come;
}
int main()
{
int n, k;
scanf("%d%d", &n, &k);
vector<node> custom;
for(int i = 0; i < n; i++)
{
int hh, mm, ss, time;
scanf("%d:%d:%d %d", &hh, &mm, &ss, &time);
int cometime = hh * 3600 + mm * 60 + ss;
if(cometime > 17*3600) continue;
tempcustomer = {cometime, time*60};
custom.push_back(tempcustomer);
}
sort(custom.begin(), custom.end(), cmp1);
vector<int> window(k, 8*3600);
double result = 0.0;
for(int i = 0; i < custom.size(); i++)
{
int tempindex = 0, minfinish = window[0];
for(int j = 1; j < k; j++)
{
if(minfinish > window[j])
{
minfinish = window[j];
tempindex = j;
}
}
if(window[tempindex] <= custom[i].come)
{
window[tempindex] = custom[i].come + custom[i].time;
}
else
{
result += (window[tempindex] - custom[i].come);
window[tempindex] += custom[i].time;
}
}
if(custom.size() == 0) printf("0.0");
else printf("%.1f", result/60.0/custom.size());
return 0;
}
小结
- vector赋值创建操作:vectorname(num, value);
感谢阅读