習題8.1 銀行排隊問題之單隊列多窗口服務 (25分)

假設銀行有K個窗口提供服務,窗口前設一條黃線,所有顧客按到達時間在黃線後排成一條長龍。當有窗口空閒時,下一位顧客即去該窗口處理事務。當有多個窗口可選擇時,假設顧客總是選擇編號最小的窗口。

本題要求輸出前來等待服務的N位顧客的平均等待時間、最長等待時間、最後完成時間,並且統計每個窗口服務了多少名顧客。

輸入格式:

輸入第1行給出正整數N(≤1000),爲顧客總人數;隨後N行,每行給出一位顧客的到達時間T和事務處理時間P,並且假設輸入數據已經按到達時間先後排好了順序;最後一行給出正整數K(≤10),爲開設的營業窗口數。這裏假設每位顧客事務被處理的最長時間爲60分鐘。

輸出格式:

在第一行中輸出平均等待時間(輸出到小數點後1位)、最長等待時間、最後完成時間,之間用1個空格分隔,行末不能有多餘空格。

在第二行中按編號遞增順序輸出每個窗口服務了多少名顧客,數字之間用1個空格分隔,行末不能有多餘空格。

輸入樣例:

9
0 20
1 15
1 61
2 10
10 5
10 3
30 18
31 25
31 2
3

輸出樣例:

6.2 17 61
5 3 1
#include <iostream>
using namespace std;

struct Node {
	int T,
		P,
		wait;
}user[1000];

int main() {
	int N, K, window[11] = { 0 }, cnt[11] = { 0 };
	cin >> N;
	for (int i = 0; i < N; ++i) {
		cin >> user[i].T >> user[i].P;
		if (user[i].P > 60)user[i].P = 60;
	}
	cin >> K;
	for (int i = 0; i < N; ++i) {
		int tmp = 1;
		for (int j = 2; j <= K; ++j) {
			if (user[i].T >= window[tmp])
				break;
			if (window[tmp] > window[j])
				tmp = j;
		}
		cnt[tmp]++;
		if (user[i].T >= window[tmp]) {
			user[i].wait = 0;
			window[tmp] = user[i].T + user[i].P;
		}
		else {
			user[i].wait = window[tmp] - user[i].T;
			window[tmp] = window[tmp] + user[i].P;
		}
	}
	int sum = 0, maxwait = 0, finish = 0;
	for (int i = 0; i < N; ++i) {
		sum += user[i].wait;
		maxwait = max(maxwait, user[i].wait);
	}
	finish = *max_element(window, window + K + 1);
	printf("%.1lf %d %d\n", 1.0 * sum / N, maxwait, finish);
	for (int i = 1; i <= K; ++i)
		cout << (i == 1 ? "" : " ") << cnt[i];
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章