1. 程式人生 > >資料結構課設 銀行排隊問題之單佇列多視窗服務

資料結構課設 銀行排隊問題之單佇列多視窗服務

5-7 銀行排隊問題之單佇列多視窗服務   (25分)

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

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

輸入格式:

輸入第1行給出正整數NN\le 10001000),為顧客總人數;隨後NN行,每行給出一位顧客的到達時間T和事務處理時間P,並且假設輸入資料已經按到達時間先後排好了順序;最後一行給出正整數KK\le 1010),為開設的營業視窗數。這裡假設每位顧客事務被處理的最長時間為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>
#include <cstdio>
#include <queue>
using namespace std;
struct node  {
	int t, p;
};
int main() {
	int n;
	scanf("%d", &n);
	queue <node> q;
	int i;
	for(i = 0; i < n; i++) {
		node tmp;
		scanf("%d %d", &tmp.t, &tmp.p);
		if(tmp.p > 60) tmp.p = 60;
		q.push(tmp);
	}
	int k;
	scanf("%d", &k);
	int win[15] = {0}, num[15] = {0};
	int wait = 0, maxn = 0, sum = 0;
	while(!q.empty()) {
		int flag = 0;
		int minn = 0x3f3f3f3f, imin = 0;
		for(i = 0; i < k; i++) {
			if(win[i] < q.front().t) {
				win[i] = q.front().t + q.front().p;
				num[i]++;
				flag = 1;
				q.pop();
				break;
			}
			if(minn > win[i]) {
				minn = win[i];
				imin = i;
			}
		}
		if(flag == 0) {
			wait = win[imin] - q.front().t;
			win[imin] += q.front().p;
			if(maxn < wait) maxn = wait;
			sum += wait;
			num[imin]++;
			q.pop();
		}
	}
	int last = win[0];
	for(i = 0; i < k; i++) {
		if(win[i] > last) last = win[i];
	}
	printf("%.1lf %d %d\n", sum * 1.0 / n * 1.0, maxn, last);
	for(i = 0; i < k; i++) {
		printf("%d", num[i]);
		if(i != k - 1) printf(" ");
		else printf("\n");
	}
	return 0;
}