1014. Waiting in Line

本文介绍了一个基于C++实现的窗口调度模拟系统。该系统通过模拟顾客在不同窗口的服务过程,计算每位顾客的服务结束时间,并针对特定顾客查询其完成服务的时间。系统采用双端队列维护每个窗口的顾客队列,并通过时间加法函数来更新服务结束时间。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>	
#include<vector>
#include<algorithm>
#include<functional>
#include<queue>
#include<deque>
#include<string>
#define MAX 1005
#define WIN 23
using namespace std;
struct customer {
	int Id;
	string serveTime;
	string leaveTime;
	customer(int _id = 0, string _serveTime = "", string _leaveTime = "") :Id(_id), serveTime(_serveTime), leaveTime(_leaveTime) {}
};
void ScanArray(int Array[], int Number);
string TimeAdd(string nowTime, int processTime);

int main() {
	freopen("D://input.txt", "r", stdin);
	int windowNumber, maxCapacity, customerNumber, queryNumber, i, j;
	int index, earlyIndex;
	int processTime[MAX], queryId[MAX];		//customers are numbered from 1 to k
	string openTime = "08:00", closeTime = "17:00", temp, earlist, status[MAX];
	deque<customer> Queue[WIN];
	cin >> windowNumber >> maxCapacity >> customerNumber >> queryNumber;

	ScanArray(processTime, customerNumber);
	ScanArray(queryId, queryNumber);

	for (i = 1; i <= maxCapacity * windowNumber&&i <= customerNumber; i++) {
		index = i % windowNumber;
		if (index == 0)
			index += windowNumber;

		if (Queue[index].size() == 0)
			temp = openTime;
		else 
			temp = status[Queue[index].back().Id];
		
		status[i] = TimeAdd(temp, processTime[i]);
		Queue[index].push_back(customer(i, temp, status[i]));
	}
	for (i = maxCapacity * windowNumber + 1; i <= customerNumber; i++) {
		earlyIndex = 0;
		earlist = "23:59";

		for (j = 1; j <= windowNumber; j++) {
			if (!Queue[j].empty() && Queue[j].front().leaveTime < earlist) {
				earlist = Queue[j].front().leaveTime;
				earlyIndex = j;
			//	earlyIndex = Queue[j].front().Id;
			}
		}
		/*if (earlyIndex != 0) {
			temp = status[Queue[earlyIndex].back().Id];
			status[i] = TimeAdd(temp, processTime[i]);

			Queue[earlyIndex].push_back(customer(i, temp, status[i]));
			Queue[earlyIndex].pop_front();
		}
		else {
			status[i] = "Sorry";
		}*/
		temp = status[Queue[earlyIndex].back().Id];
		status[i] = TimeAdd(temp, processTime[i]);

		Queue[earlyIndex].push_back(customer(i, temp, status[i]));
		Queue[earlyIndex].pop_front();
	}

	for (i = 1; i <= queryNumber; i++) {
		cout << status[queryId[i]] << endl;
	}
	return 0;
}
void ScanArray(int Array[], int Number) {
	int i;
	Array[0] = 0;
	for (i = 1; i <= Number; i++) {
		cin >> Array[i];
	}
	return;
}
string TimeAdd(string nowTime, int processTime) {
	string ret;
	int hour, minute, sumMinute;
	string _hour, _minute;
	if (nowTime == "Sorry" || nowTime >= "17:00")
		ret = "Sorry";
	else {
		hour = (nowTime[0] - '0') * 10 + (nowTime[1] - '0');
		minute = (nowTime[3] - '0') * 10 + (nowTime[4] - '0');
		sumMinute = hour * 60 + minute;
		sumMinute += processTime;
		hour = sumMinute / 60;
		minute = sumMinute % 60;
		_hour = to_string(hour);
		if (hour < 10 && hour >0)
			_hour = "0" + _hour;
		else if (hour == 0)
			_hour = "00";

		_minute = to_string(minute);
		if (minute < 10 && minute>0)
			_minute = "0" + _minute;
		else if (minute == 0)
			_minute = "00";
		ret = _hour + ":" + _minute;

	}
	return ret;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值