結果
| 問題 |
No.1196 A lazy student
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-08-22 16:16:51 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 143 ms / 1,000 ms |
| コード長 | 2,074 bytes |
| コンパイル時間 | 1,137 ms |
| コンパイル使用メモリ | 82,508 KB |
| 最終ジャッジ日時 | 2025-01-13 10:06:39 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 14 |
ソースコード
#include <iostream>
#include <cmath>
#include <string>
#include <cassert>
using ldouble = long double;
struct Parser {
std::string s;
int n, i;
ldouble p, q, r;
ldouble expr() {
// std::cerr << "expr: " << i << "\n";
auto ret = sexpr();
while (s.substr(i, 2) == "or") {
i += 2;
auto x = sexpr();
ret = 1 - (1 - ret) * (1 - x);
ret = ret * (1 - r) + (1 - ret) * r;
}
return ret;
}
ldouble sexpr() {
// std::cerr << "sexpr: " << i << "\n";
auto ret = term();
while (s.substr(i, 3) == "and") {
i += 3;
auto x = term();
ret *= x;
ret = ret * (1 - r) + (1 - ret) * r;
}
return ret;
}
ldouble term() {
// std::cerr << "term: " << i << "\n";
ldouble ret;
if (s[i] == '(') {
++i;
ret = expr();
assert(s[i] == ')');
++i;
} else if (s.substr(i, 7) == "random(") {
i += 7;
auto x = expr();
auto y = expr();
assert(s[i] == ')');
++i;
auto t = x * y;
ret = t * p + (1 - t) * q;
} else if (s.substr(i, 3) == "YES") {
i += 3;
ret = 1;
} else {
assert(s.substr(i, 2) == "NO");
i += 2;
ret = 0;
}
return ret;
}
ldouble exec() {
i = 0;
auto ret = expr();
assert(i == n);
return ret;
}
explicit Parser(const std::string& s, ldouble p, ldouble q, ldouble r)
: s(s), n(s.length()), i(0), p(p), q(q), r(r) {}
};
void solve() {
int n;
ldouble p, q, r;
std::string s;
std::cin >> n >> p >> q >> r >> s;
Parser parser(s, p, q, r);
auto ans = parser.exec();
std::cout << std::lround(std::floor(ans * 100)) << "\n";
}
int main() {
std::cin.tie(nullptr);
std::ios::sync_with_stdio(false);
solve();
return 0;
}