struct Customer
{
int arrive_time, cost_time, start_time, end_time, wait_time = 0;
};
int N, K;
bool cmp(const Customer &c1, const Customer &c2)
{
return c1.arrive_time < c2.arrive_time;
}
int count_seconds(string st)
{
int h = stoi(st.substr(0, 2));
int m = stoi(st.substr(3, 2));
int s = stoi(st.substr(6, 2));
return h * 60 * 60 + m * 60 + s;
}
int main()
{
cin >> N >> K;
int open_time = 8 * 60 * 60, close_time = 17 * 60 * 60;
// 读取所有顾客,以便按到达时间排序
vector<Customer> customers(N);
for(int i = 0; i < N; ++i)
{
string come_time;
int p_time;
cin >> come_time >> p_time;
Customer customer;
customer.arrive_time = count_seconds(come_time);
customer.cost_time = p_time * 60;
customers[i] = customer;
}
// 按到达时间排序
sort(customers.begin(), customers.end(), cmp);
double sum_wait = 0;
int valid = N;
// k个窗口,k个队列
vector<queue<Customer>> windows(K);
for(int i = 0; i < N; ++i)
{
Customer &cur_user = customers[i];
// 17:00之后到达的顾客不计算
if(cur_user.arrive_time > close_time)
{
valid = i;
break;
}
// 先排空窗口
if(i < K)
{
// 是否再8:00之前到达
if(cur_user.arrive_time < open_time)
cur_user.start_time = open_time;
else
cur_user.start_time = cur_user.arrive_time;
cur_user.end_time = cur_user.start_time + cur_user.cost_time;
cur_user.wait_time = cur_user.start_time - cur_user.arrive_time;
windows[i].push(cur_user);
sum_wait += cur_user.wait_time;
}
else // 再找最早的可用窗口
{
int win = 0;
int last_end_time = windows[win].front().end_time;
for(int i = 1; i < K; ++i)
{
if(windows[i].front().end_time < last_end_time)
{
win = i;
last_end_time = windows[win].front().end_time;
}
}
windows[win].pop();
// 计算各时间
if(cur_user.arrive_time > last_end_time)
cur_user.start_time = cur_user.arrive_time;
else
cur_user.start_time = last_end_time;
cur_user.end_time = cur_user.start_time + cur_user.cost_time;
cur_user.wait_time = cur_user.start_time - cur_user.arrive_time;
windows[win].push(cur_user);
sum_wait += cur_user.wait_time;
}
}
printf("%.1f", sum_wait / valid / 60.0);
return 0;
}
1017 Queueing at Bank
最新推荐文章于 2025-07-30 14:22:39 发布