7-6 银行排队问题之单队列多窗口加VIP服务 (30分)

#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);
    }
}

### 回答1: 这道题目涉及到银行排队问题中的队列多窗口VIP服务,需要将VIP客户插队进入队列,并优先获得服务。需要根据业务流程,对普通客户和VIP客户进行不同的处理,以达到提高银行服务质量的目的。具体实现方式需要考虑排队的算法、客户类型的判断和优先级规则的设定等。 ### 回答2: 7-6 银行排队问题之单队列多窗口vip服务是一种常见的优化服务思路。传统的银行排队系统,无论是基于多队列还是队列多窗口,都存在着排队等待时间较长,服务效率较低等问题。而队列多窗口vip服务的优化思路,可以有效解决这些问题队列多窗口的基本思路是,将所有的客户都排在一个队列中,然后根据窗口数量启用相应的服务窗口进行服务,窗口之间为并行关系。这样可以最大限度地利用服务资源,提高服务效率。同时,通过不同窗口的不同服务人员,也可以使服务质量更细致和全面。 在此基础上,vip服务的思路,可以更好地满足不同客户的需求。通过提供vip服务,可以将时间紧迫、服务等待时间过长等问题最大限度地解决,为特殊客户提供更优质的服务。而一些普通客户,由于需要等待vip客户的服务,也可以提高他们的服务期望。这种策略可以减少银行排队的时间,同时也可以提高客户对银行服务的满意度。 当然,队列多窗口vip服务仍然存在着一些问题。例如,如何平衡普通客户和vip客户的服务,以及如何组织队列,这些都需要正确地设置目标函数和并发控制策略。目前多数银行排队系统已经采用了这种方案,不断优化和改进,以提供更优质的服务。 ### 回答3: 银行排队问题一直是一个热门话题,银行为了尽可能自动化服务来优化客户排队的体验,不断探索创新。在早期,普通的队列窗口服务是唯一的方案,但是这种服务方式存在着一些弊端,比如说等待时间长、不公平等。 于是,为了解决这些问题银行入了VIP服务,并采用了多队列多窗口的设施。这种方式较为合理,可以使得客户在最短的时间内完成服务,并且只要做了合理的规划和需求的细化,就可以最大限度地减小排队的时间和不公平因素的影响。 首先,多队列多窗口能够让客户更快速地获得服务,因为服务可以在多个窗口同时进行,而不是集中在一个窗口上。也就是说,客户到达银行之后可以更快地完成业务办理,不再需要去排队。同时,也减少了客户等待的烦恼。 其次,应该根据客户需求服务窗口。通常情况下,不同类型的业务需要不同的窗口,而领导、有关部门和利益相关者都可享受优先办理,例如入账、出款、对公、VIP、孕妇/老人、贵宾等。而不同的业务行的应该指派专业的柜员,以保证业务质量。 最后,银行VIP服务可以快客户获得服务的速度。一些高端客户和精英消费者可以享受优先服务的待遇,让这些客户不会在普通的队伍中等待。通过给予VIP客户合适的专用服务窗口,民为客服,整体的服务效率也得到了提升。 总之,银行排队问题的解决仍然在不断探索和完善之中。最终,能够以客户的体验和顾客的利益为中心,发挥先进技术的优势,以更好的服务,不断实现银行与客户间的互惠共赢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值