Tengo este problema:
Olaf el artífice fabrica y vende complejas decoraciones. Recientemente, ha estado haciendo chucherías para colgar de los árboles de Navidad. Las chucherías vienen en dos colores: rojo y azul. En su taller, Olaf tiene bolas rojas RO y BO chucherías azules. Además, Olaf tiene S adornos sin pintar de repuesto, que puede convertir en adornos de cualquier color. Olaf no puede convertir una chuchería roja en una azul, o viceversa. El palacio real acaba de hacer un pedido de bolas rojas RP y bolas azules BP. Desafortunadamente para Olaf, el Rey Goblin te ha contratado para evitar que Olaf pueda cumplir ¡este orden! Por la noche, te colarás en el taller de Olaf y destruirás algunas de sus chucherías, así que que Olaf no puede hacer el pedido, no importa cómo elija pintar sus adornos de repuesto. Olaf puede despertarse en cualquier momento, por lo que deberá trabajar de manera rápida y eficiente. Que es la menor cantidad de chucherías que puedas destruir para evitar que Olaf cumpla con esta orden? \ ¿cómo lo resolvería?

He intentado: `

import sys
sys.setrecursionlimit(9999999)
import random
DEBUG = True
#----------------------------------------------------
fin = open('baublesin.txt', 'r')
fin = fin.read()
if DEBUG: print(fin)
fin = fin.split(' ')
red = int(fin[0])
if DEBUG: print(red)
blu = int(fin[1])
if DEBUG: print(blu)
spa = int(fin[2])
if DEBUG: print(spa)
ore = int(fin[3])
if DEBUG: print(ore)
obl = int(fin[4])
if DEBUG: print(obl)
total = red + blu + spa
if DEBUG: print(total)
#----------------------------------------------------
# red - red_broken + ore + spa < red
# blu - blu_broken + obl + spa < blu
#
def check():
    if red - red_broken + ore + spa < red:
        if blu - blu_broken + obl + spa < blu:
            return True #if all the conditions are met, the problem is solved
    if blu - blu_broken + obl + spa < blu:
        if red - red_broken + ore + spa < red:
            return True # ''
    return False

red_broken = random.randrange(0, total, 1)
blu_broken = random.randrange(0, total, 1)
d = 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 #dont even question
a = 0
while a <= 300000: #should be enough
    red_broken = random.randrange(0, total, 1)
    blu_broken = random.randrange(0, total, 1)
    if check():
        if red_broken+blu_broken < d:
            d = red_broken+blu_broken
    a = a+1
#rn, the problem should be solved
print('done:')
print(d)
open('baublesout.txt', 'w').write(str(broken_red+broken_blu))

`

-3
Pol 27 ago. 2020 a las 05:54

1 respuesta

La mejor respuesta

Hablando francamente, esto es mucho más un problema matemático que un problema de pitón (uno que parece haber abordado de manera muy ineficiente). Veamos qué información tenemos:

  • RO adornos rojos
  • BO bolas azules
  • S adornos de repuesto
  • RP pidió chucherías rojas
  • RB pidió adornos azules

Solo necesita verificar un caso de borde (para que no termine rompiendo un número negativo de adornos) Esta es solo una función concisa que hace el trabajo. Funciona contando el número mínimo de adornos de repuesto que deben asignarse a cada color para averiguar el número más pequeño de adornos para romper.

def CalculateMinimumBroken(RO, BO, S, RP, BP):
    if max((RP - RO),0) + max((BP - BO),0) > S:
        return 0
    if RO > RP and BO > BP:
        return(S + min((RO-RP),(BO-BP)) + 1)

    return(S - max(0,(RP - RO)) - max(0,(BP - BO)) + 1)
1
Karan Shishoo 27 ago. 2020 a las 03:40