#include <algorithm>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
struct List
{
int start_time;//头指针计总分等待时间
int end_time;//头指针计最长等待时间
int wait_time;//代表服务了多少人
int VIP;//队列头表示是否为VIP序列
struct List *next;
};
void Insert_List(List *head, List *tail, List *L)//插入到某一个窗口之后 + 头节点变化(
{
List *p = tail->next;
tail->next->next = L;
tail->next = L;
if(L->start_time > p->end_time)
{
L->end_time = L->start_time + L->wait_time;
L->wait_time = 0;
}
else
{
L->end_time = p->end_time + L->wait_time;
L->wait_time = p->end_time - L->start_time;
}
head->start_time += L->wait_time;
if(head->end_time < L->wait_time)
head->end_time = L->wait_time;
head->wait_time++;
}
bool Judge_have_VIP(List *number,int people_number, int head, int end_time)//当VIP通道的位置为空时,判断后面是否有VIP人员
{
for(int i = head; i < people_number; i++)
{
if(number[i].VIP == 1 && number[i].start_time <= end_time)
return true;
if(number[i].start_time > end_time)
return false;
}
return false;
}
int Find_least_pos(List *list_tail, int list_number, int delete_pos, int limit)//寻找序列中能插入的pos
{
int i, j, Min;
for(i = 0, j = 0; i < list_number; i++)
{
if(i == delete_pos)
continue;
if(j == 0)
Min = list_tail[i].next->end_time;
else if(Min > list_tail[i].next->end_time)
Min = list_tail[i].next->end_time;
j++;
}
for(i = 0; i < list_number; i++)
{
if(i == delete_pos)
continue;
if(Min == list_tail[i].next->end_time || list_tail[i].next->end_time <= limit)
{
return i;
}
}
}
int Get_short_List(List list_tail[15], int list_number, List *number, int pos_number, int people_number, int VIP_l)//寻找窗口的空余并且规则返回插入点;
{
int Min, i, j;
int pos = Find_least_pos(list_tail, list_number, -1, number[pos_number].start_time);
if(pos == VIP_l)
{
if(number[pos_number].VIP == 1)
return pos;
else{
if(Judge_have_VIP(number, people_number, pos_number + 1, list_tail[pos].next->end_time))
{
return Find_least_pos(list_tail, list_number, VIP_l, number[pos_number].start_time);
}
else
return VIP_l;
}
}
else
{
if(number[pos_number].VIP == 1)
{
if(list_tail[pos].next->end_time == list_tail[VIP_l].next->end_time || number[pos_number].start_time >= list_tail[VIP_l].next->end_time)
return VIP_l;
else
return pos;
}
else
return pos;
}
}
int main()
{
List *number;
int people_number, VIP_l, have_VIP = 0;
scanf("%d", &people_number);
number = new List[people_number + 2];
for(int i = 0; i < people_number; i++)
{
scanf("%d %d %d", &number[i].start_time, &number[i].wait_time, &number[i].VIP);
if(number[i].VIP == 1)
have_VIP = 1;
if(number[i].wait_time > 60)
number[i].wait_time = 60;
number[i].next = NULL;
}
int list_number;
List list_head[15], list_tail[15];
scanf("%d %d", &list_number, &VIP_l);
for(int i = 0; i < list_number; i++)
{
list_head[i].wait_time = 0;
list_head[i].start_time = 0;
list_head[i].end_time = 0;
list_head[i].VIP = 0;
if(i == VIP_l)
list_head[i].VIP = 1;
list_head[i].next = NULL;
list_tail[i].next = &list_head[i];
}
for(int i = 0; i < people_number; i++)
{
int j = 0;
j = Get_short_List(list_tail, list_number, number, i, people_number, VIP_l);
Insert_List(&list_head[j], &list_tail[j], &number[i]);
}
double sum = 0;
int longest_wait = 0, finish_time = 0;
for(int i = 0; i < list_number; i++)
{
sum += list_head[i].start_time;
if(longest_wait < list_head[i].end_time)
longest_wait = list_head[i].end_time;
if(finish_time < list_tail[i].next->end_time)
finish_time = list_tail[i].next->end_time;
}
printf("%.1lf %d %d\n", sum/people_number, longest_wait, finish_time);
for(int i = 0; i < list_number; i++)
{
if(i)
printf(" %d", list_head[i].wait_time);
else
printf("%d", list_head[i].wait_time);
}
}
7-6 银行排队问题之单队列多窗口加VIP服务 (30分)
最新推荐文章于 2023-12-26 22:34:00 发布