結果
問題 | No.1196 A lazy student |
ユーザー |
![]() |
提出日時 | 2025-03-26 15:48:52 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 231 ms / 1,000 ms |
コード長 | 3,058 bytes |
コンパイル時間 | 223 ms |
コンパイル使用メモリ | 82,508 KB |
実行使用メモリ | 180,524 KB |
最終ジャッジ日時 | 2025-03-26 15:49:57 |
合計ジャッジ時間 | 2,732 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 14 |
ソースコード
def tokenize(s):tokens = []i = 0n = len(s)while i < n:if i + 5 < n and s[i:i+6] == 'random':tokens.append('random')i += 6elif i + 2 < n and s[i:i+3] == 'YES':tokens.append('YES')i += 3elif i + 2 < n and s[i:i+3] == 'and':tokens.append('and')i += 3elif i + 1 < n and s[i:i+2] == 'NO':tokens.append('NO')i += 2elif i + 1 < n and s[i:i+2] == 'or':tokens.append('or')i += 2elif s[i] in '()':tokens.append(s[i])i += 1else:raise ValueError(f"Unexpected character at position {i} in {s}")return tokensdef shunting_yard(tokens):output = []stack = []precedence = {'or': 1, 'and': 2, 'random': 3}function_names = {'random'}for token in tokens:if token in ['YES', 'NO']:output.append(token)elif token in ['and', 'or']:while stack and stack[-1] != '(' and precedence.get(stack[-1], 0) >= precedence[token]:output.append(stack.pop())stack.append(token)elif token == 'random':stack.append(token)elif token == '(':stack.append(token)elif token == ')':while stack[-1] != '(':output.append(stack.pop())stack.pop() # Remove '('if stack and stack[-1] in function_names:output.append(stack.pop())else:raise ValueError(f"Unexpected token {token}")while stack:output.append(stack.pop())return outputdef evaluate_postfix(postfix, P, Q, R):stack = []for token in postfix:if token == 'YES':stack.append(1.0)elif token == 'NO':stack.append(0.0)elif token == 'and':b = stack.pop()a = stack.pop()res = a * bflipped = res * (1 - R) + (1 - res) * Rstack.append(flipped)elif token == 'or':b = stack.pop()a = stack.pop()res = 1 - (1 - a) * (1 - b)flipped = res * (1 - R) + (1 - res) * Rstack.append(flipped)elif token == 'random':y = stack.pop()x = stack.pop()both_yes = x * yres = both_yes * P + (1 - both_yes) * Qstack.append(res)else:raise ValueError(f"Unknown postfix token {token}")return stack[0]def main():import sysinput = sys.stdin.read().split()ptr = 0N = int(input[ptr])ptr += 1P = float(input[ptr])ptr += 1Q = float(input[ptr])ptr += 1R = float(input[ptr])ptr += 1S = input[ptr].strip()tokens = tokenize(S)postfix = shunting_yard(tokens)prob = evaluate_postfix(postfix, P, Q, R)result = prob * 100print(int(result // 1))if __name__ == '__main__':main()