結果
| 問題 | No.425 ジャンケンの必勝法 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-10-21 01:46:13 |
| 言語 | C++23(gcc16) (gcc 16.2.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 2 ms / 2,000 ms |
| + 352µs | |
| コード長 | 1,913 bytes |
| 記録 | |
| コンパイル時間 | 5,807 ms |
| コンパイル使用メモリ | 256,496 KB |
| 実行使用メモリ | 9,856 KB |
| 最終ジャッジ日時 | 2026-10-21 01:46:52 |
| 合計ジャッジ時間 | 8,243 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge5_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 17 |
ソースコード
#include <algorithm>
#include <array>
#include <cassert>
#include <cmath>
#include <iostream>
#include <utility>
#include <vector>
int main() {
using namespace std;
constexpr int N = 101;
constexpr double EPS = 1e-12;
using Mat = array<array<double, N>, N>;
using Vec = array<double, N>;
// Ab + c = b を満たす b を求める
auto solve = [&](const Mat &A, const Vec &c) -> Vec {
Mat mat{};
Vec b{};
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
mat[i][j] = (i == j ? 1.0 : 0.0) - A[i][j];
}
b[i] = c[i];
}
for (int j = 0; j < N; j++) {
int piv = j;
for (int i = j + 1; i < N; i++) {
if (abs(mat[i][j]) > abs(mat[piv][j])) { piv = i; }
}
assert(abs(mat[piv][j]) >= EPS);
swap(mat[j], mat[piv]);
swap(b[j], b[piv]);
const double inv = 1.0 / mat[j][j];
for (int i = j + 1; i < N; i++) {
const double t = mat[i][j] * inv;
mat[i][j] = 0.0;
for (int k = j + 1; k < N; k++) {
mat[i][k] -= mat[j][k] * t;
}
b[i] -= t * b[j];
}
}
for (int i = N - 1; i >= 0; i--) {
double s = b[i];
for (int j = i + 1; j < N; j++) {
s -= mat[i][j] * b[j];
}
b[i] = s / mat[i][i];
}
return b;
};
int p, q;
cin >> p >> q;
Mat A{};
Vec c{};
for (int i = 0; i < N; i++) {
if (i > 0) { A[i][max(0, i - q)] += 1.0 * i / 200; }
if (i < N - 1) { A[i][min(N - 1, i + q)] += (100.0 - i) / 300; }
c[i] = 1.0 / 3 + 1.0 * i / 600;
}
Vec b = solve(A, c);
double ans = 1.0 / 3 + b[p] / 3;
cout << format("{:.15f}\n", ans);
}