結果

問題 No.297 カードの数式
ユーザー gew1fw
提出日時 2025-06-12 20:02:30
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 1,635 bytes
コンパイル時間 187 ms
コンパイル使用メモリ 82,048 KB
実行使用メモリ 83,328 KB
最終ジャッジ日時 2025-06-12 20:07:48
合計ジャッジ時間 2,871 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 1 TLE * 1 -- * 21
権限があれば一括ダウンロードができます

ソースコード

diff #

import itertools

n = int(input())
cards = input().split()
digits = [c for c in cards if c.isdigit()]
ops = [c for c in cards if c in '+-']

d = len(digits)
o = len(ops)
k = o + 1

def generate_partitions(d, k):
    if k == 1:
        return [(d,)]
    partitions = []
    for first in range(1, d - (k-1) + 1):
        for rest in generate_partitions(d - first, k-1):
            partitions.append((first,) + rest)
    return partitions

partitions = generate_partitions(d, k)

max_val = -float('inf')
min_val = float('inf')

for partition in partitions:
    for num_perm in itertools.permutations(digits):
        numbers = []
        index = 0
        valid = True
        for p in partition:
            if index + p > len(num_perm):
                valid = False
                break
            part = num_perm[index:index+p]
            num_str = ''.join(part)
            numbers.append(int(num_str))
            index += p
        if not valid:
            continue
        seen_ops = set()
        for op_perm in itertools.permutations(ops):
            if op_perm not in seen_ops:
                seen_ops.add(op_perm)
                if len(numbers) != len(op_perm) + 1:
                    continue
                current = numbers[0]
                for i in range(len(op_perm)):
                    if op_perm[i] == '+':
                        current += numbers[i+1]
                    else:
                        current -= numbers[i+1]
                if current > max_val:
                    max_val = current
                if current < min_val:
                    min_val = current

print(max_val, min_val)
0