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)
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)
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)
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)
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
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
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)
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)
def solve(inp, args): # TODO: Solve the problem random.seed(args['seed']) ns = parse(inp) return '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)