結果
問題 |
No.297 カードの数式
|
ユーザー |
![]() |
提出日時 | 2025-04-15 22:12:50 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,387 bytes |
コンパイル時間 | 200 ms |
コンパイル使用メモリ | 82,184 KB |
実行使用メモリ | 77,388 KB |
最終ジャッジ日時 | 2025-04-15 22:14:13 |
合計ジャッジ時間 | 2,488 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 19 WA * 4 |
ソースコード
import sys from itertools import permutations def generate_group_sizes(m, num_groups): group_sizes_list = [] def dfs(current, remaining, path): if len(path) == num_groups - 1: path = path + [remaining] group_sizes_list.append(path) return for i in range(1, remaining - (num_groups - len(path) - 1) + 1): dfs(current + i, remaining - i, path + [i]) dfs(0, m, []) return group_sizes_list def main(): input = sys.stdin.read().split() n = int(input[0]) cards = input[1:n+1] digits = [c for c in cards if c.isdigit()] ops = [c for c in cards if c in '+-'] m = len(digits) k = len(ops) group_sizes_list = generate_group_sizes(m, k+1) max_val = -float('inf') min_val = float('inf') for group_sizes in group_sizes_list: if sum(group_sizes) != m or len(group_sizes) != k+1: continue seen_ops = set() for op_perm in permutations(ops): if op_perm in seen_ops: continue seen_ops.add(op_perm) # Compute max value sorted_desc = sorted(digits, key=lambda x: -int(x)) remaining_desc = sorted_desc.copy() numbers_max = [] valid = True for i in range(k+1): size = group_sizes[i] if len(remaining_desc) < size: valid = False break if i == 0: group = remaining_desc[:size] numbers_max.append(int(''.join(group))) remaining_desc = remaining_desc[size:] else: op = op_perm[i-1] if op == '+': group = remaining_desc[:size] numbers_max.append(int(''.join(group))) remaining_desc = remaining_desc[size:] else: if len(remaining_desc) < size: valid = False break group = remaining_desc[-size:] group = group[::-1] numbers_max.append(int(''.join(group))) remaining_desc = remaining_desc[:-size] if not valid: continue current_val = numbers_max[0] for i in range(k): if op_perm[i] == '+': current_val += numbers_max[i+1] else: current_val -= numbers_max[i+1] if current_val > max_val: max_val = current_val # Compute min value sorted_asc = sorted(digits, key=lambda x: int(x)) remaining_asc = sorted_asc.copy() numbers_min = [] valid = True for i in range(k+1): size = group_sizes[i] if len(remaining_asc) < size: valid = False break if i == 0: group = remaining_asc[:size] numbers_min.append(int(''.join(group))) remaining_asc = remaining_asc[size:] else: op = op_perm[i-1] if op == '+': group = remaining_asc[:size] numbers_min.append(int(''.join(group))) remaining_asc = remaining_asc[size:] else: if len(remaining_asc) < size: valid = False break group = remaining_asc[-size:] group = group[::-1] numbers_min.append(int(''.join(group))) remaining_asc = remaining_asc[:-size] if not valid: continue current_val_min = numbers_min[0] for i in range(k): if op_perm[i] == '+': current_val_min += numbers_min[i+1] else: current_val_min -= numbers_min[i+1] if current_val_min < min_val: min_val = current_val_min print(max_val, min_val) if __name__ == '__main__': main()