Edición de la Universidad de Zhejiang "Estructura de datos (segunda edición)" Recopilación de preguntas-Ejercicio 8.2

Ejercicio 8.2 Multiventana de cola única más servicio VIP de problemas de colas bancarias (30 punto (s))

Suponga que el banco tiene K ventanillas para brindar servicios, y se coloca una línea amarilla frente a la ventanilla, y todos los clientes se alinean en una fila larga después de la línea amarilla de acuerdo con la hora de llegada. Cuando una ventana está libre, el próximo cliente irá a la ventana para procesar la transacción. Cuando hay varias ventanas para elegir, se asume que el cliente siempre elige la ventana con el número más bajo.

Algunos bancos brindarán a los clientes VIP varios servicios preferenciales, como la apertura de ventanas VIP. Para maximizar el uso de recursos, el mecanismo de servicio de la ventana VIP se define como: cuando no hay clientes VIP en la cola, la ventana atiende a los clientes normales; cuando la ventana está inactiva y hay clientes VIP esperando en la cola , el VIP que está clasificado en la parte superior Los clientes disfrutan de los servicios de esta ventana. Al mismo tiempo, cuando es el turno de salida de un cliente VIP, si la ventana VIP no está vacía, el cliente puede elegir una ventana ordinaria gratis; en caso contrario, debe elegir la ventana VIP .

Esta pregunta requiere generar el tiempo de espera promedio, el tiempo de espera más largo y el tiempo de finalización final de N clientes que vinieron a esperar el servicio y contar cuántos clientes son atendidos por cada ventana.

Ejemplo

#include <iostream>
#include <cstdio>
#include <vector>
#include <unordered_map>
#include <list>
using namespace std;

struct Customer {
    string name;
    int    T;
    int    P;
    int    id;
};

unordered_map<string, int> circle;
list<Customer> customer;
vector<int> wait;

int main()
{
    int N, M;
    cin >> N >> M;
    circle.reserve(N);
    for (int i = 0; i < M; i++) {
        string name;
        int L;
        cin >> L;
        for(int j = 0; j < L; j++) {
            cin >> name;
            circle.insert({name, i+1});
        }
    }
    wait.resize(N);
    for(int i = 0; i < N; i++) {
        Customer user;
        cin >> user.name >> user.T >> user.P;
        user.id = circle[user.name];
        customer.push_back(user);
    }
    int last_finish = 0;
    for(int i = 0; i < N;) {
        Customer c = customer.front();
        int id = c.id;
        if(last_finish < c.T) last_finish = c.T;
        if(id == 0) {
            wait[i++] = last_finish - c.T;
            last_finish += min(c.P, 60);
            cout << c.name << endl;
            customer.pop_front();
        } else {
            for(auto x = customer.begin(); x != customer.end(); ++x) {
                if(x->T > last_finish) break;
                if(x->id != id) continue;
                wait[i++] = last_finish - x->T;
                last_finish += min(x->P, 60);
                cout << x->name << endl;
                x = customer.erase(x);
                --x;
            }
        }
    }
    double sum = 0;
    for(auto &x : wait) sum += x;
    printf("%.1f\n", sum/N);
    return 0;
}

Ideas:

Establezca la hora de finalización de la ventana Final para que sea mayor o igual que la hora de llegada de la contraparte, y luego busque la ventana con la hora de finalización más temprana, verifique si hay algún VIP esperando en la cola de clientes y si hay algún VIP, compruebe si el VIP también se encuentra en el primer lote de ventanas que finalizó. Utilice la ventana Vip para dar servicio a Vip; de lo contrario, use el servicio de ventanas que se encontró anteriormente para atender al cliente objetivo.

Supongo que te gusta

Origin blog.csdn.net/u012571715/article/details/113408454
Recomendado
Clasificación