#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 1005;
int cnt[maxn];
int Left[maxn];//每个窗口 最后一个人离开的时间
struct Node{
int arr, prc;//到达时间 事务处理时间
}p[maxn];
int main(){
int n, k;
int tmp, mx = 0, sum = 0, cur = 0;
scanf("%d",&n);
for(int i = 0; i < n; i++){
scanf("%d %d",&p[i].arr, &tmp);
p[i].prc = min(tmp, 60);
}
scanf("%d",&k);
memset(Left, 0, sizeof(Left));
memset(cnt, 0, sizeof(cnt));
for(int i = 0; i < n; i++){
cur = p[i].arr;
int mi = INF, id;
for(int j = 0; j < k; j++){
if(p[i].arr >= Left[j]){//先取当前已空闲
id = j;
break;
}
//都不空闲则去最早结束的
if(mi > Left[j]){//选择空窗口
mi = Left[j];
id = j;
}
}
//cout << id << ' ' << i << endl;
cnt[id]++;
tmp = Left[id]-p[i].arr;//计算等待时间
mx = max(mx, tmp);
//更新每个窗口的最后完成时间
if(tmp>0){
Left[id] += p[i].prc;
sum += tmp;
}
//窗口先空 人后到
else{
Left[id] += -tmp + p[i].prc;
}
}
int ed = 0;
for(int i = 0; i < k; i++){
ed = max(Left[i], ed);
}
printf("%.1lf %d %d\n", sum*1.0/(n*1.0), mx, ed);
for(int i = 0; i < k; i++){
if(i==0) printf("%d", cnt[i]);
else printf(" %d",cnt[i]);
}
printf("\n");
//system("pause");
return 0;
}
数据结构实验 7-5 银行排队问题之单队列多窗口服务 (25分)
最新推荐文章于 2023-06-16 11:10:24 发布