Práctica PAT

Reescritura de registro

Es el primer blog que graba preguntas, llevo un año jugando ACM y no tengo este hábito. . .
Recientemente me estoy preparando para el Grado A de la PTA y, por cierto, grabo el pozo (el pozo PAT realmente no es una mierda, no se da el rango de datos y el significado de la pregunta es ...)

1014 Esperando en línea (30 分)

Suponga que un banco tiene N ventanas abiertas para el servicio. Hay una línea amarilla frente a las ventanas que divide el área de espera en dos partes. Las reglas para que los clientes esperen en fila son:

El espacio dentro de la línea amarilla frente a cada ventana es suficiente para contener una línea con los clientes M. Por lo tanto, cuando todas las N líneas estén llenas, todos los clientes después de (incluido) el (NM + 1) st tendrán que esperar en una línea detrás de la línea amarilla.
Cada cliente elegirá la línea más corta para esperar al cruzar la línea amarilla. Si hay dos o más líneas con la misma longitud, el cliente siempre elegirá la ventana con el número más pequeño.
El cliente [i] tardará T [i] minutos en procesar su transacción.
Ahora, dado el tiempo de procesamiento de cada cliente, se supone que debe indicar la hora exacta en la que un cliente ha terminado su negocio.

Por ejemplo, suponga que un banco tiene 2 ventanas y cada ventana puede tener 2 clientes esperando dentro de la línea amarilla. Hay 5 clientes esperando con transacciones que demoran 1, 2, 6, 4 y 3 minutos, respectivamente. A las 08:00 de la mañana, el cliente1 se atiende en la ventana1 mientras que el cliente2 se atiende en la ventana2. Customer3 esperará frente a window1 y customer4 esperará frente a window2. Customer5 esperará detrás de la línea amarilla.

A las 08:01, el cliente1 termina y el cliente5 ingresa a la línea frente a la ventana1, ya que esa línea parece más corta ahora. Customer2 saldrá a las 08:02, customer4 a las 08:06, customer3 a las 08:07 y finalmente customer5 a las 08:10.

Entrada

Cada archivo de entrada contiene un caso de prueba. Cada caso comienza con una línea que contiene 4 números enteros positivos: N (<= 20, número de ventanas), M (<= 10, la capacidad máxima de cada línea dentro de la línea amarilla), K (<= 1000, número de clientes) y Q (<= 1000, número de consultas de clientes).

La siguiente línea contiene K números enteros positivos, que son el tiempo de procesamiento de los K clientes.

La última línea contiene Q enteros positivos, que representan a los clientes que preguntan sobre el tiempo en que pueden realizar sus transacciones. Los clientes están numerados del 1 al K.

Salida

Para cada uno de los clientes Q, imprima en una línea la hora a la que finalizó su transacción, en el formato HH: MM donde HH está en [08, 17] y MM está en [00, 59]. Tenga en cuenta que dado que el banco está cerrado todos los días después de las 17:00, para aquellos clientes que no pueden ser atendidos antes de las 17:00, debe mostrar "Lo sentimos" en su lugar.

Entrada de muestra

2 2 7 5
1 2 6 4 3534 2
3 4 5 6 7
1
2
3
Salida de muestra

08:07
08:06
08:10
17:00
Lo siento

Idea principal:

Los bancos hacen cola para hacer negocios. Hay n ventanas. Cada ventana tiene una línea amarilla. Hay hasta m personas en la línea amarilla. Las personas restantes esperan fuera de la línea amarilla para
dar k personas y el tiempo que necesitan para procesar el negocio. , consulta la hora de finalización del procesamiento comercial de p individuo. Si excede las 17:00 cuando se inicia el negocio, la salida comenzará el negocio a las
08:00 y el negocio finalizará a las 17:00 . Si el negocio ya se procesó, continúe procesando hasta que se procese el negocio La ventana está cerrada hasta el final.
Si alguien maneja el final del negocio en una determinada ventana, la persona fuera de la línea amarilla irá al final de esa ventana para esperar. Si alguien maneja el final del negocio en ambas ventanas, elija la ventana más pequeña

Método: No es
más que elegir el equipo más corto y más alto a la hora de elegir un equipo, y no puedes volver a cambiar de equipo después de la selección.
De esta forma, cada equipo está bien mantenido. Cada vez que se quita el jefe de cada equipo a la persona con menos tiempo de servicio restante, el tiempo salta al final de su servicio, y luego si hay alguien en la cola de la línea amarilla para mantenimiento, se insertará en el equipo. .
Es solo un poco molesto + repugnante.
Lo que está sin palabras es: la llamada Nota de que, dado que el banco cierra todos los días después de las 17:00, para aquellos clientes que no pueden ser atendidos antes de las 17:00, deben emitir "Lo siento" en su lugar. En realidad, no se sirve a las 17:00, no El servicio se detendrá a las 17:00. ¿Es realmente bueno forzar horas extras como esta? ? ? ? ? ? ? ? ? ? ? ? El camarero piensa en mmp, y yo también en mmp
con la premisa de saber lo anterior. Lo cambié durante 40 minutos. Ha pasado mucho tiempo desde que recibí una tarjeta de preguntas simuladas como esa. Tal vez haya pasado demasiado tiempo.
La mentalidad realmente colapsó, así que la cambié hasta el punto en que no tuve tiempo y fui a cf.
Número de presentaciones maxxxxxxx
Código:

#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pr pair<int,int>
pr ti[20][20];
int cou[20];
int ans[1001];
int be[1001];
int main()
{
    
    
	int n, m;
	int k, q;
	cin >> n >> m >> k >> q;
	int i;
	queue<pr> que;
	for (i = 0; i < k; i++)
	{
    
    
		int t;
		cin >> t;
		if (i < n * m)
		{
    
    
			ti[i % n][i / n].first = t;
			ti[i % n][i / n].second = i;
			be[i] = 0;
			cou[i % n]++;
		}
		else que.push(mp(t, i));
	}
	int now = 0;
	while (k)
	{
    
    
		int mi = INT_MAX;
		for (i = 0; i < n; i++)
		{
    
    
			if (mi > ti[i][0].first && cou[i])
			{
    
    
				mi = ti[i][0].first;
			}
		}
		//cout << now << endl;
		now += mi;
		for (i = 0; i < n; i++)
		{
    
    
			if (cou[i])ti[i][0].first -= mi;
			if (!ti[i][0].first && cou[i])
			{
    
    
				k--;
				ans[ti[i][0].second] = now;
				int j;
				for (j = 0; j < cou[i] - 1; j++)
				{
    
    
					ti[i][j] = ti[i][j + 1];
					
				}
				if (que.size())ti[i][j] = que.front(), que.pop();
				else cou[i]--;
				if(cou[i])be[ti[i][0].second] = now+1;
			}
		}
	}
	while (q--)
	{
    
    
		int w;
		cin >> w;
		w--;
		if (be[w]<=540)printf("%02d:%02d\n", ans[w] / 60 + 8, ans[w] % 60);
		else cout << "Sorry" << endl;
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/ylwhxht/article/details/103413390
Recomendado
Clasificación