def solve(inp, args):
    random.seed(args['seed']) 
    ns = parse(inp)
    # input 
    M = ns.m # number of pizzas
    pizzas = ns.pizzas # pizza has fields label and ingredients 
    t2 = ns.t2 # number of teams 
    t3 = ns.t3
    t4 = ns.t4
    currpizza = 0
    # output 
    out2 = [] # [int]
    out3 = []
    out4 = []
    # sort the pizzas 
    pizzas.sort(key=lambda x: len(x.ingredients))
    # assign to teams 4, then to teams 3, and then to teams 2
    while currpizza < M-3 and t4 > 0:
        out4.append([4, pizzas[currpizza].label, pizzas[currpizza+1].label, pizzas[currpizza+2].label, pizzas[currpizza+3].label])
        currpizza += 4
        t4 -= 1
    while currpizza < M-2 and t3 > 0:
        out3.append([3, pizzas[currpizza].label, pizzas[currpizza+1].label, pizzas[currpizza+2].label])
        currpizza += 3
        t3 -= 1
    while currpizza < M-1 and t2 > 0:
        out2.append([2, pizzas[currpizza].label, pizzas[currpizza+1].label])
        currpizza += 2
        t2 -= 1

    out = out2 + out3 + out4 
    out = list(map(serialize, out))
    return '\n'.join([str(len(out))] + out)
Beispiel #2
0
def solve(inp, args):
    random.seed(args['seed'])
    ns = parse(inp)
    rects = []
    for x1 in range(0, ns.r):
        for y1 in range(0, ns.c):
            for dx, dy in dims(ns):
                x2, y2 = x1 + dx - 1, y1 + dy - 1
                if x2 >= ns.r or y2 >= ns.c: continue
                r = (x1, y1, x2, y2)
                t, m = ing(r, ns)
                if min(t, m) >= ns.l:
                    rects.append(r)
    used = [[False] * ns.c for _ in range(ns.r)]
    random.shuffle(rects)
    pick = []
    for r in rects:
        ok = True
        for x, y in coords(r):
            ok = ok and not used[x][y]
        if not ok: continue
        for x, y in coords(r):
            used[x][y] = True
        pick.append(r)
    out = ["{} {} {} {}".format(*r) for r in pick]
    return '\n'.join([str(len(out))] + out)
Beispiel #3
0
def solve(inp, args):
    # TODO: Solve the problem
    random.seed(args['seed'])
    ns = parse(inp)
    left = set([pizza['id'] for pizza in ns.pizzas])
    adj_mat = [[0 for _ in range(ns.M)] for _ in range(ns.M)]
    for pizza1 in ns.pizzas:
        for pizza2 in ns.pizzas:
            adj_mat[pizza1['id']][pizza2['id']] = len(
                pizza1['ingredients'].intersection(pizza2['ingredients']))
    teams = []

    def pop_mat(v):
        for i in range(ns.M):
            adj_mat[v][i] = float('inf')
            adj_mat[i][v] = float('inf')

    def find_best_list(team_size):
        if len(left) < team_size:
            return None
        else:
            L = []
            v = left.pop()
            pq = PriorityQueue()
            L.append(v)
            for i in left:
                pq.put((adj_mat[v][i], i))
            for _ in range(team_size - 1):
                popped = pq.get()
                L.append(popped[1])
                left.remove(popped[1])
            for v in L:
                pop_mat(v)
        return L

    team_pizzas = []
    for _ in range(ns.T4):
        # pick pizzas
        pizza_list = find_best_list(team_size=4)
        if pizza_list == None:
            break
        team_pizzas.append(pizza_list)
    for _ in range(ns.T3):
        # pick pizzas
        pizza_list = find_best_list(team_size=3)
        if pizza_list == None:
            break
        team_pizzas.append(pizza_list)
    for _ in range(ns.T2):
        # pick pizzas
        pizza_list = find_best_list(team_size=2)
        if pizza_list == None:
            break
        team_pizzas.append(pizza_list)
    out = []
    out.append(str(len(team_pizzas)))
    for row in team_pizzas:
        out.append(' '.join(map(str, [len(row)] + row)))
    res = '\n'.join(out)
    return res
def solve(inp, args):
    # TODO: Solve the problem
    random.seed(args['seed'])
    ns = parse(inp)
    pizzas_left = list()
    for i in range(ns.M):
        pizzas_left.append(i)
    pizzas_left.sort(key=lambda p_id: len(ns.pizzas[p_id]['ingredients']))

    def pick(no):
        picked = []
        if len(pizzas_left) < no: return None
        for _ in range(no):
            p_id = pizzas_left.pop()
            picked.append(p_id)
        return picked

    teams = []
    for _ in range(ns.T4):
        picked = pick(4)
        if picked == None: break
        teams.append(' '.join(map(str, [4] + picked)))
    for _ in range(ns.T3):
        picked = pick(3)
        if picked == None: break
        teams.append(' '.join(map(str, [3] + picked)))

    for _ in range(ns.T2):
        picked = pick(2)
        if picked == None: break
        teams.append(' '.join(map(str, [2] + picked)))

    out = [str(len(teams))] + teams
    return '\n'.join(out)
Beispiel #5
0
def solve(inp, args):
    random.seed(args['seed'])
    ns = parse(inp)
    # input
    M = ns.m  # number of pizzas
    pizzas = ns.pizzas  # pizza has fields label and ingredients
    t2 = ns.t2  # number of teams
    t3 = ns.t3
    t4 = ns.t4
    # output
    out2, out3, out4 = [], [], []

    visited = [False for i in range(M)]  # visited or not based on pizza label
    pizzas_left = M

    for i in range(M):
        p = pizzas[i]
        if visited[p.label]:
            continue
        if pizzas_left < 2:
            break
        visited[i] = True
        current = set(p.ingredients)
        # try to find next best
        if t4 > 0 and pizzas_left > 3:
            ret = [4, p.label]
            for k in range(3):
                next = nextBest(current, i, pizzas, visited)
                current = current.union(set(pizzas[next].ingredients))
                visited[pizzas[next].label] = True
                ret.append(pizzas[next].label)
            out4.append(ret)
            pizzas_left -= 4
            t4 -= 1
        elif t3 > 0 and pizzas_left > 2:
            ret = [3, p.label]
            for k in range(2):
                next = nextBest(current, i, pizzas, visited)
                current = current.union(set(pizzas[next].ingredients))
                visited[pizzas[next].label] = True
                ret.append(pizzas[next].label)
            out3.append(ret)
            pizzas_left -= 3
            t3 -= 1
        elif t2 > 0:
            next = nextBest(current, i, pizzas, visited)
            current = current.union(set(pizzas[next].ingredients))
            visited[pizzas[next].label] = True
            ret = [2, p.label, pizzas[next].label]
            out2.append(ret)
            pizzas_left -= 2
            t2 -= 1

    print(
        f"There are {len(out2)} teams2, {len(out3)} teams 3, {len(out4)} teams4."
    )
    out = out2 + out3 + out4
    out = list(map(serialize, out))
    return '\n'.join([str(len(out))] + out)
Beispiel #6
0
def score(inp, out):
    ns = parse(inp)
    used = [[False] * ns.c for _ in range(ns.r)]
    rects = [tuple(map(int, l.split())) for l in out.split('\n')[1:]]
    sc = 0
    for r in rects:
        sc += area(r)
        for x, y in coords(r):
            if used[x][y]:
                raise ValueError('rectangles overlaps')
            used[x][y] = True

    return sc
def solve(inp, args):
    random.seed(args['seed'])
    ns = parse(inp)
    # input
    M = ns.m  # number of pizzas
    pizzas = ns.pizzas  # pizza has fields label and ingredients
    t2 = ns.t2  # number of teams
    t3 = ns.t3
    t4 = ns.t4
    # output
    out2, out3, out4 = [], [], []

    visited = [False for i in range(M)]  # visited or not based on pizza label
    pizzas_left = M
Beispiel #8
0
def test(tc_name, inp):
    print(tc_name)
    print('==============')
    ns = parse(inp)
    plt.scatter([2, 3, 4], [ns.T2, ns.T3, ns.T4])
    plt.show()
    ingredients = {}
    plt.scatter([i for i in range(len(ns.pizzas))],
                [len(pizza['ingredients']) for pizza in ns.pizzas])
    plt.show()
    for pizza in ns.pizzas:
        for ing in pizza['ingredients']:
            if ing not in ingredients:
                ingredients[ing] = 0
            ingredients[ing] += 1
    print(len(ingredients))
    plt.scatter([i for i in range(len(ingredients))], ingredients.values())
    plt.show()
def solve(inp, args):
    random.seed(args['seed'])
    ns = parse(inp)
    left = [pizza['id'] for pizza in ns.pizzas]

    left.sort(key=lambda p_id: len(ns.pizzas[p_id]['ingredients']))

    team_pizzas = []
    for _ in range(ns.T4):
        # pick pizzas
        if len(left) < 4:
            break
        pizza_list = []
        for _ in range(4):
            pizza_list.append(left.pop())
        team_pizzas.append(pizza_list)

    for _ in range(ns.T3):
        # pick pizzas
        if len(left) < 3:
            break
        pizza_list = []
        for _ in range(3):
            pizza_list.append(left.pop())
        team_pizzas.append(pizza_list)

    for _ in range(ns.T2):
        # pick pizzas
        if len(left) < 2:
            break
        pizza_list = []
        for _ in range(2):
            pizza_list.append(left.pop())
        team_pizzas.append(pizza_list)
    out = []
    out.append(str(len(team_pizzas)))
    for row in team_pizzas:
        out.append(' '.join(map(str, [len(row)] + row)))
    res = '\n'.join(out)
    return res
Beispiel #10
0
def solve(inp, args):
    # TODO: Solve the problem
    random.seed(args['seed'])
    ns = parse(inp)
    # ns.m, t2, t3, t4, pizzas
    # [[2, p, p], [2, p, p]]
    M = ns.m
    pizzas = ns.pizzas
    t2 = ns.t2
    t3 = ns.t3
    t4 = ns.t4
    currpizza = 0

    out2 = []  # [int]
    out3 = []
    out4 = []
    # very very dumb solver
    while currpizza < M - 1 and t2 > 0:
        out2.append([2, pizzas[currpizza].label, pizzas[currpizza + 1].label])
        currpizza += 2
        t2 -= 1
    while currpizza < M - 2 and t3 > 0:
        out3.append([
            3, pizzas[currpizza].label, pizzas[currpizza + 1].label,
            pizzas[currpizza + 2].label
        ])
        currpizza += 3
        t3 -= 1
    while currpizza < M - 3 and t4 > 0:
        out4.append([
            4, pizzas[currpizza].label, pizzas[currpizza + 1].label,
            pizzas[currpizza + 2].label, pizzas[currpizza + 3].label
        ])
        currpizza += 4
        t4 -= 1

    out = out2 + out3 + out4
    out = list(map(serialize, out))
    return '\n'.join([str(len(out))] + out)
Beispiel #11
0
def solve(inp, args):
    # TODO: Solve the problem
    random.seed(args['seed'])
    ns = parse(inp)
    left = [pizza['id'] for pizza in ns.pizzas]
    team_pizzas = []
    for _ in range(ns.T4):
        # pick pizzas
        if len(left)<4:
            break
        pizza_list = []
        for _ in range(4):
            pizza_list.append(left.pop())
        team_pizzas.append(pizza_list)
    
    for _ in range(ns.T3):
        # pick pizzas
        if len(left)<3:
            break
        pizza_list = []
        for _ in range(3):
            pizza_list.append(left.pop())
        team_pizzas.append(pizza_list)

    for _ in range(ns.T2):
        # pick pizzas
        if len(left)<2:
            break
        pizza_list = []
        for _ in range(2):
            pizza_list.append(left.pop()) 
        team_pizzas.append(pizza_list)
    out = []
    out.append(str(len(team_pizzas)))
    for row in team_pizzas:
        out.append(' '.join(map(str, [len(row)]+row)))
    res = '\n'.join(out)
    return res
def solve(inp, args):
    random.seed(args['seed'])
    ns = parse(inp)
    # input
    M = ns.m  # number of pizzas
    pizzas = ns.pizzas  # pizza has fields label and ingredients
    t2 = ns.t2  # number of teams
    t3 = ns.t3
    t4 = ns.t4
    currpizza = 0

    out2 = []  # List[List[Int]] [[2, 3, 4], [2, 0, 1]]
    out3 = []  # [[3, 1, 0, 4], [3, 2, 3, 5]]
    out4 = []
    # assign to teams 2, then to teams 3, and then to teams 4
    while currpizza < M - 1 and t2 > 0:
        out2.append([2, pizzas[currpizza].label, pizzas[currpizza + 1].label])
        currpizza += 2
        t2 -= 1
    while currpizza < M - 2 and t3 > 0:
        out3.append([
            3, pizzas[currpizza].label, pizzas[currpizza + 1].label,
            pizzas[currpizza + 2].label
        ])
        currpizza += 3
        t3 -= 1
    while currpizza < M - 3 and t4 > 0:
        out4.append([
            4, pizzas[currpizza].label, pizzas[currpizza + 1].label,
            pizzas[currpizza + 2].label, pizzas[currpizza + 3].label
        ])
        currpizza += 4
        t4 -= 1

    out = out2 + out3 + out4
    out = list(map(serialize, out))
    return '\n'.join([str(len(out))] + out)
Beispiel #13
0
def solve(inp, args):
    # TODO: Solve the problem
    random.seed(args['seed'])
    ns = parse(inp)

    return '0'
Beispiel #14
0
def test(tc_name, inp):
    print(tc_name)
    print(inp)
    print('==============')
    ns = parse(inp)
def solve(inp, args):
    random.seed(args['seed']) 
    ns = parse(inp)
    # input 
    M = ns.m # number of pizzas
    pizzas = ns.pizzas # pizza has fields label and ingredients 
    t2 = ns.t2 # number of teams 
    t3 = ns.t3
    t4 = ns.t4
    # output 
    out2 = [] # [int]
    out3 = []
    out4 = []
    # sort the pizzas 
    pizzas.sort(key=lambda x: len(x.ingredients))
    # [Boolean] representing if pizza visited
    visited = [False for i in range(M)]
    pizzas_left = M 
    currpizza = 0 
    # main loop, while pizzas_left > 1 && t2 > 0 || pizzas_left > 2 && t3>0 || pizzas_left>3 && t4>0
    while (pizzas_left>1 and t2>0) or (pizzas_left>2 and t3>0) or (pizzas_left>3 and t4>0):
        while currpizza<M and visited[pizzas[currpizza].label]:
            currpizza += 1
        # ending condition 
        if currpizza == M:
            break 

        current = set(pizzas[currpizza].ingredients)
        visited[pizzas[currpizza].label] = True 
        pizzas_left -= 1
        inflection = M-1
        curr_index = M-1
        lowest_waste = 100000000000000
        # find inflection point (valley)
        while curr_index > currpizza:
            if visited[pizzas[curr_index].label]:
                curr_index -= 1
                continue
            currwaste = waste(current, set(pizzas[curr_index].ingredients))
            if currwaste > lowest_waste:
                break # lowest_waste is the valley
            lowest_waste = currwaste
            inflection = curr_index
            curr_index -= 1
        # invalid 
        if visited[pizzas[inflection].label]:
            break 
        # assign to teams [4, 3, 2]
        if (pizzas_left>2 and t4>0) and (inflection>currpizza+1) and (inflection<M-1) and (visited[pizzas[inflection-1].label] is False) and (visited[pizzas[inflection+1].label] is False):
            out4.append([4, pizzas[currpizza].label, pizzas[inflection].label, pizzas[inflection-1].label, pizzas[inflection+1].label])
            visited[pizzas[inflection].label] = True
            visited[pizzas[inflection+1].label] = True 
            visited[pizzas[inflection-1].label] = True 
            pizzas_left -= 3
            t4 -= 1
        elif (pizzas_left>1 and t3>0) and ((inflection>currpizza+1 and (visited[pizzas[inflection-1].label] is False)) or (inflection<M-1 and (visited[pizzas[inflection+1].label] is False))):
            waste_left = 1000000
            if inflection>currpizza+1 and (visited[pizzas[inflection-1].label] is False):
                waste_left = waste(current | set(pizzas[inflection].ingredients), set(pizzas[inflection-1].ingredients))
            waste_right = 1000000
            if inflection<M-1 and (visited[pizzas[inflection+1].label] is False):
                waste_right = waste(current | set(pizzas[inflection].ingredients), set(pizzas[inflection+1].ingredients))
            # decide which to include: left or right neighbour 
            if waste_left < waste_right:
                out3.append([3, pizzas[currpizza].label, pizzas[inflection].label, pizzas[inflection-1].label])
                visited[pizzas[inflection-1].label] = True  
            else:
                out3.append([3, pizzas[currpizza].label, pizzas[inflection].label, pizzas[inflection+1].label])
                visited[pizzas[inflection+1].label] = True 
            visited[pizzas[inflection].label] = True 
            pizzas_left -= 2
            t3 -= 1
        elif (pizzas_left>0 and t2>0):
            out2.append([2, pizzas[currpizza].label, pizzas[inflection].label])
            visited[pizzas[inflection].label] = True 
            pizzas_left -= 1
            t2 -= 1
    
    print(f"There are {len(out2)} teams2, {len(out3)} teams 3, {len(out4)} teams4.")
    out = out2 + out3 + out4 
    out = list(map(serialize, out))
    return '\n'.join([str(len(out))] + out)