代码源自:https://blog.csdn.net/liuchuo/article/details/54573734
感谢!
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct node {
int come, time;//到达时间,服务时长
};
bool cmp1(node a, node b) {
return a.come < b.come;//到达时间比较
}
int main() {
int n, k,i,j;
scanf("%d%d", &n, &k);
vector<node> custom;
for(i = 0; i < n; i++) {//custom中记录所有17点以前到达的顾客
int hh, mm, ss, time;
scanf("%d:%d:%d %d", &hh, &mm, &ss, &time);
int cometime = hh * 3600 + mm * 60 + ss;
if(cometime > 61200) continue;//17点之后不记录
struct node tempcustomer;
tempcustomer.come=cometime;
tempcustomer.time=time * 60;
custom.push_back(tempcustomer);//vector添加数据的缺省方法是push_back()
}
sort(custom.begin(), custom.end(), cmp1);//按到达时间比较排队
vector<int> window(k, 28800);//记录窗口的结束时间,全部初始化为八点
double result = 0.0;
for(i = 0; i < custom.size(); i++) {
//从窗口0--k-1查找最早结束当前处理的窗口
int tempindex = 0, minfinish = window[0];//最早结束时间
for(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;
}