結果
| 問題 |
No.3021 Maximize eval
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-02-14 21:29:44 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 238 ms / 2,000 ms |
| コード長 | 2,798 bytes |
| コンパイル時間 | 213 ms |
| コンパイル使用メモリ | 12,288 KB |
| 実行使用メモリ | 16,180 KB |
| 最終ジャッジ日時 | 2025-02-14 21:30:03 |
| 合計ジャッジ時間 | 4,413 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 15 |
ソースコード
import sys
S = sys.stdin.read().strip().splitlines()
if not S:
sys.exit(0)
# S[0]~S[T] それぞれがテストケース
T = int(S[0])
ans = []
line = 1
for _ in range(T):
s = S[line].strip()
line += 1
n = len(s)
res = [] # 出力文字列のリスト
in_token = False # 現在数字(項)の中か
# token_sign: 現在の項の符号(+1 か -1)
# 項の開始は,先頭なら自動的に正とする.
token_sign = 1
token_len = 0 # 現在の項の長さ(数字の個数)
for i, ch in enumerate(s):
if ch != '?':
# 固定文字の場合
if ch in '+-':
# ch は演算子
res.append(ch)
in_token = False
token_len = 0
# 演算子の意味するところで次の項の符号を決める
token_sign = 1 if ch=='+' else -1
else:
# ch は数字
res.append(ch)
# ここは数字でなければならないので
in_token = True
token_len += 1
continue
# ch == '?'
# ここは自由に置換可能.
if not in_token:
# 「項の開始位置」では必ず数字を選ぶ.
if token_sign > 0:
res.append('9')
else:
res.append('1')
in_token = True
token_len = 1
else:
# すでに項中
if token_sign > 0:
# 正の項なら,項を伸ばすほうが大きくなる.
res.append('9')
token_len += 1
else:
# 負の項ならできるだけ項は短いほうがよい.
# もしすでに1桁以上あり,かつ「ここで項を終えて演算子にしてもよい」なら
# ・末尾でなければ(i < n-1)
# ・次の文字が固定の演算子でない(もし '?' ならあとで数字にできる)
if token_len >= 1 and i < n-1 and s[i+1] not in '+-':
# ここで項を終える.新しい項は演算子で始めるので,
# 次の項は自由に正にできる(+ を選ぶ).
res.append('+')
in_token = False
token_len = 0
token_sign = 1
else:
# 終われないので,数字として延長.
res.append('1')
token_len += 1
# 最後の文字は必ず数字になるように(状態が in_token=True であるはず)
ans.append(''.join(res))
sys.stdout.write("\n".join(ans))