Algoritmia - El llenado de barriles

 
Vista:

El llenado de barriles

Publicado por Frank Rafael (2 intervenciones) el 27/03/2006 15:16:33
Este problema me gusta porque utiliza una ley física que desde pequeño me llamó la atención. Si alguien fuera tan amable de mandarme una solución, gracias.

El llenado de barriles

Existen N (1 < N <= 100) barriles iguales y vacíos en una superficie horizontal
El volumen de cada barril es de 100 unidades. Cada dos de ellos están
conectados a una tubería. Cada tubería es conectada al fondo de dos barriles y
esta tiene su propia válvula las cuales pueden estar solo en dos posiciones:
"ABIERTO" o "CERRADO". Al principio todas las válvulas están cerradas. Si una
válvula es abierta, entonces el líquido de un barril conectado a otro barril
puede rápida y libremente fluir al otro de modo que el nivel de líquido en
estos barriles será igual (el principio de los vasos comunicantes). Si una
válvula es cerrada, el fluido a través de esta tubería es imposible. Dos tipos
de operaciones son permitidas:

1) "P" (para echar) cuando alguna cantidad de líquido es vertida en el barril
prescrito. La descripción de la operación es: "P A M", donde A es el barril y
M es la cantidad de líquido (en unidades) a ser vertida en el barril (A y M
son enteros, (0 < A <= N, 0 < M <= 1000).

2) "V" (para una válvula) cuando una válvula prescrita es cambiada a la
posición contraria (por ejemplo, esta válvula se cierra si ha sido abierta y
se abre si ha sido cerrada). La descripción de la operación es "V n1 n2",
donde n1 y n2 son los números de los barriles que están conectados con una
tubería que tiene esta válvula (n1 y n2 son enteros, 0 < n1 <= N, 0 < n2 <= N,
n1 <> n2). Dos descripciones diferentes "V n1 n2" y "V n2 n1" se refieren a
la misma válvula.

Su tarea es ejecutar una secuencia de operaciones dadas. No tendrás en cuenta
la cantidad de líquido en las tuberías. Si alguna operación de echar ("P") no
puede ser ejecutada debido al derrame del líquido, la ejecución de esta
secuencia de la operación debe ser detenida y dar una salida apropiada.

ENTRADA:

El fichero de entrada (BARRILES.IN) contiene los números N y K (número de
operaciones 0 < K <= 1000) en la primera línea y la descripción de las
operaciones en las siguientes K líneas, una descripciín por línea.

SALIDA:

EL fichero de salida (BARRILES.OUT) contiene la palabra "OK" y los valores de
un mínimo y un máximo nivel de líquido entre todos los barriles al finalizar,
si la secuencia de operaciones fue completamente ejecutada o la palabra
"DESBORDAMIENTO" y el número de la operación durante la cual el desbordamiento
del líquido sucedió. Los valores del nivel de líquido deben ser escritos como
números reales con dos lugares decimales.

Ejemplo de Entrada Ejemplo de Salida
2 6 OK 75.00 95.00
P 1 63
P 2 37
V 1 2
P 1 50
V 2 1
P 1 20
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

El llenado de barriles

Publicado por Alejandro (307 intervenciones) el 05/03/2024 20:55:09
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# Leer la entrada
with open("BARRILES.IN", "r") as entrada:
    lineas = entrada.readlines()
 
N, K = map(int, lineas[0].split())
barriles = [0] * N  # Inicializar los niveles de líquido en los barriles
min_nivel = float('inf')
max_nivel = 0
 
# Función para realizar la operación de echar líquido en un barril
def echar(barril, cantidad):
    barriles[barril - 1] += cantidad
    nonlocal min_nivel, max_nivel
    min_nivel = min(min_nivel, barriles[barril - 1])
    max_nivel = max(max_nivel, barriles[barril - 1])
 
# Función para realizar la operación de cambiar la posición de la válvula
def cambiar_valvula(n1, n2):
    barriles[n1 - 1] = barriles[n2 - 1] = min(barriles[n1 - 1], barriles[n2 - 1])
 
# Ejecutar la secuencia de operaciones
for i in range(1, K + 1):
    operacion, *parametros = lineas[i].split()
 
    if operacion == "P":
        A, M = map(int, parametros)
        echar(A, M)
    elif operacion == "V":
        n1, n2 = map(int, parametros)
        cambiar_valvula(n1, n2)
 
    # Verificar si hay desbordamiento
    if min_nivel < 0 or max_nivel > 100:
        with open("BARRILES.OUT", "w") as salida:
            salida.write(f"DESBORDAMIENTO {i}\n")
        break
 
# Escribir la salida si no hubo desbordamiento
else:
    with open("BARRILES.OUT", "w") as salida:
        salida.write(f"OK {min_nivel:.2f} {max_nivel:.2f}\n")

Frank, este código lee el archivo de entrada, ejecuta las operaciones descritas y verifica si hay algún desbordamiento. Finalmente, escribe la salida en el archivo correspondiente. Asegúrate de proporcionar el archivo de entrada ("BARRILES.IN") con el formato adecuado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar